【问题标题】:Dereferenced pointer assignments取消引用的指针分配
【发布时间】:2021-09-05 18:20:12
【问题描述】:

考虑下面的代码 sn-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);

上述sn-p的输出如下:

16705
16705
65

现在很明显,&l 是一个 char 的地址,p=(int*)&l 让一个 int 指针,即 p 指向同一个位置,这与指针 t 相同。现在,如果我正确取消引用 p ,它将尝试取消引用 4 个连续的内存块(假设 int 指向 4 个字节)并打印出 *t 也会发生的各种垃圾值,但是当我打印 e 时,我得到 65让我感到困惑的是 e=*t 应该与 *p*t 相同?

【问题讨论】:

  • 修正您在该段中的第二条语句,“现在如果我取消引用 p... 我将调用未定义的行为,并且无法再对我的代码的行为得出任何结论”

标签: c pointers casting


【解决方案1】:

取消引用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);

直接告诉你程序有问题需要修复。

【讨论】:

  • 所以这继续说 e=*t 是未定义的,并且返回与 l (65) 相同的值不是预期的?
  • @lava_07 这不是我写的。您的 p 是一个指向 int 的指针,但是(使用强制转换)您强制它指向 char。然后通过取消引用p 来读取值。这是未定义的行为,因此任何事情都可能发生。
  • @lava_07 ...但是e=*t; 有同样的问题。这一切都归结为读取 char 类型对象的位置,就好像它是一个 int 类型对象一样。
猜你喜欢
  • 1970-01-01
  • 2011-10-06
  • 2018-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-20
  • 2020-04-21
  • 1970-01-01
相关资源
最近更新 更多