dan*_*iel 2 c printf pointers undefined-behavior dereference
代码
int n = 25;
int *p = &n;
printf("%x\n %d\n %x\n", p, p[0], p[1]);
Run Code Online (Sandbox Code Playgroud)
返回:
\<adress-of-p
25
\<adress-of-p>
Run Code Online (Sandbox Code Playgroud)
当然我永远不会这样做,但在 K&R 中指出
“如果 pa 是指针,则表达式可以将其与下标一起使用;pa[i] 与 *(pa+i) 相同。
所以我很好奇。
这个说法
printf("%x\n %d\n %x\n", p, p[0], p[1]);
Run Code Online (Sandbox Code Playgroud)
由于两个原因调用未定义的行为。
第一个是要输出指针,您应该使用正确的转换说明符。第二个问题是,您不能取消引用这样的p[1]不指向有效对象的指针。
相反,你可以写例如
printf("%p\n %d\n %p\n", ( void * )p, p[0], ( void * )( p + 1 ) );
Run Code Online (Sandbox Code Playgroud)