解除引用的指针赋值
Dereferenced pointer assignments
考虑下面的代码片段:
int *p=NULL,*t=NULL,e;
char l=65;
char *k=&l;
p=(int*)&l;
t=(int*)k;
e=*t;
printf("%d\n",*p);
printf("%d\n",*t);
printf("%d\n",e);
以上片段的输出如下:
16705
16705
65
现在很明显 &l
是一个 char 的地址,p=(int*)&l
让一个 int 指针,即 p 指向相同的位置,这与指针 t 相同。现在,如果我正确地取消引用 p 那么它将尝试取消引用 4 个连续的内存块(假设 int 指向 4 个字节)并打印出 *t
也会发生的各种垃圾值但是当我打印 e 我得到 65后面这让我感到困惑,因为 e=*t
应该与 *p
或 *t
相同?
取消引用 p
(即使用 *p
)是未定义的行为,因为该位置没有 int
。任何事情都可能发生......没有人能解释你得到的输出。
用“gcc -Wall -Wextra -pedantic ...”编译你的代码给我:
main.cpp:19:1: warning: array subscript 'int[0]' is partly outside array bounds of 'char[1]' [-Warray-bounds]
19 | printf("%x\n",*p);
这直接告诉你程序有问题需要修复。
考虑下面的代码片段:
int *p=NULL,*t=NULL,e;
char l=65;
char *k=&l;
p=(int*)&l;
t=(int*)k;
e=*t;
printf("%d\n",*p);
printf("%d\n",*t);
printf("%d\n",e);
以上片段的输出如下:
16705
16705
65
现在很明显 &l
是一个 char 的地址,p=(int*)&l
让一个 int 指针,即 p 指向相同的位置,这与指针 t 相同。现在,如果我正确地取消引用 p 那么它将尝试取消引用 4 个连续的内存块(假设 int 指向 4 个字节)并打印出 *t
也会发生的各种垃圾值但是当我打印 e 我得到 65后面这让我感到困惑,因为 e=*t
应该与 *p
或 *t
相同?
取消引用 p
(即使用 *p
)是未定义的行为,因为该位置没有 int
。任何事情都可能发生......没有人能解释你得到的输出。
用“gcc -Wall -Wextra -pedantic ...”编译你的代码给我:
main.cpp:19:1: warning: array subscript 'int[0]' is partly outside array bounds of 'char[1]' [-Warray-bounds]
19 | printf("%x\n",*p);
这直接告诉你程序有问题需要修复。