首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有未初始化指针的奇怪行为

带有未初始化指针的奇怪行为
EN

Stack Overflow用户
提问于 2014-09-11 15:18:38
回答 3查看 926关注 0票数 1

我用未初始化的指针观察这种奇怪的行为。

从下面的示例中可以看出,有时它打印一个NULL值,而另一些则以交替的方式打印一个有效的地址。

为什么会发生这种情况?

代码语言:javascript
复制
int *i;
printf("%p\n", i);

输出

(零)

代码语言:javascript
复制
int *i;
printf("%p\n", i);

int *j;
printf("%p\n", j);

输出

0x7fff2d0c1b50

(零)

代码语言:javascript
复制
int *i;
printf("%p\n", i);

int *j;
printf("%p\n", j);

int *k;
printf("%p\n", k);

输出

(零)

0x7fffda 5284b0

(零)

代码语言:javascript
复制
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

(零)

代码语言:javascript
复制
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)

EN

回答 3

Stack Overflow用户

发布于 2014-09-11 15:26:30

来自C99标准(n1256):

6.7.8初始化 ..。 10如果没有显式初始化具有自动存储持续时间的对象,则其值是不确定的。

票数 2
EN

Stack Overflow用户

发布于 2014-09-11 15:23:37

具有自动持续时间的变量(即没有静态存储类的局部变量)开始包含垃圾,除非它们被显式初始化。

来源:http://c-faq.com/decl/initval.html

票数 1
EN

Stack Overflow用户

发布于 2014-09-11 15:23:43

试一试,而不是:

代码语言:javascript
复制
int *i = 0;
printf("%p\n", i);

int *j = 0;
printf("%p\n", j);

如果您愿意的话,可以编写= NULL而不是= 0,但是无论哪种方式,区别在于指针是初始化的。

这有什么关系?答:因为ij是变量。也就是说,ij是计算机内存中称为堆栈的一个区域中的小的、保留的存储块。根据像int *i这样的指针定义,这样一个存储块的目的是保存一个地址。但是,在您的示例中,您没有将地址写入存储块;因此,当您的printf试图读取地址时,它只会得到任何可能发生的信息,这些信息发生在定义int *i之前的存储块中。因此,行为是未定义的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25791255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档