我用未初始化的指针观察这种奇怪的行为。
从下面的示例中可以看出,有时它打印一个NULL值,而另一些则以交替的方式打印一个有效的地址。
为什么会发生这种情况?
码
int *i;
printf("%p\n", i);输出
(零)
码
int *i;
printf("%p\n", i);
int *j;
printf("%p\n", j);输出
0x7fff2d0c1b50
(零)
码
int *i;
printf("%p\n", i);
int *j;
printf("%p\n", j);
int *k;
printf("%p\n", k);输出
(零)
0x7fffda 5284b0
(零)
码
int *i;
printf("%p\n", i);
int *j;
printf("%p\n", j);
int *k;
printf("%p\n", k);
int *l;
printf("%p\n", l);输出
0x400510
(零)
0x7fff6d7089c0
(零)
码
int *i;
printf("%p\n", i);
int *j;
printf("%p\n", j);
int *k;
printf("%p\n", k);
int *l;
printf("%p\n", l);
int *m;
printf("%p\n", m);输出
0x357521cbc0
0x400520
(零)
0x7fff715849e0
(零)
系统: x86_64 GNU/Linux ( x86_64 -redhat-linux)
编译器: gcc版本4.1.2 20080704 (RedHat4.1.2-52)
发布于 2014-09-11 15:26:30
来自C99标准(n1256):
6.7.8初始化 ..。 10如果没有显式初始化具有自动存储持续时间的对象,则其值是不确定的。
发布于 2014-09-11 15:23:37
具有自动持续时间的变量(即没有静态存储类的局部变量)开始包含垃圾,除非它们被显式初始化。
发布于 2014-09-11 15:23:43
试一试,而不是:
int *i = 0;
printf("%p\n", i);
int *j = 0;
printf("%p\n", j);如果您愿意的话,可以编写= NULL而不是= 0,但是无论哪种方式,区别在于指针是初始化的。
这有什么关系?答:因为i和j是变量。也就是说,i和j是计算机内存中称为堆栈的一个区域中的小的、保留的存储块。根据像int *i这样的指针定义,这样一个存储块的目的是保存一个地址。但是,在您的示例中,您没有将地址写入存储块;因此,当您的printf试图读取地址时,它只会得到任何可能发生的信息,这些信息发生在定义int *i之前的存储块中。因此,行为是未定义的。
https://stackoverflow.com/questions/25791255
复制相似问题