看,
typedef struct jig
{
int *a;
int *b;
}temp;
现在第1阶段:
temp *b;
b= (temp*)malloc(sizeof(temp));
if(b->a != NULL)
printf("a is not null\n");
else
printf("a is null\n");
if(b->b != NULL)
printf("b is not null\n");
else
printf("b is null\n");
输出是:
a is null
b is null
现在第2阶段:
temp b;
if(b.a != NULL)
printf("a is not null\n");
else
printf("a is null\n");
if(b.b != NULL)
printf("b is not null\n");
else
printf("b is null\n");
输出是:
a is not null
b is not null
为什么会这样?
答案 0 :(得分:39)
指针没有默认值。他们拥有的价值就是他们现在使用的内存中的垃圾。有时特定的编译器会将内存清零,但这不是标准的,所以不要指望它。)
来自malloc的内存为NULL是巧合;它可能是任何其他价值同样容易。您需要并且应该始终手动将所有指针设置为NULL。
另一种选择是你也可以使用calloc,它与malloc做同样的事情,但是在它给你的内存块中将所有位设置为0。这对堆栈变量没有帮助,所以你仍然必须自己将它们设置为NULL。
答案 1 :(得分:7)
这完全依赖于操作系统,没有说明指针指向何种情况,因为没有指定。无论如何,你应该始终将指针设置为NULL。
答案 2 :(得分:3)
机会,这就是发生的事情。没有人说未初始化的非静态内存需要保留任何值。两者都可以包含任何内容。
malloc
只返回了内存
从一个已删除的页面(所以它包含0)答案 3 :(得分:2)
在这两种情况下,temp
的内容都是未初始化(随机)数据。它们可以为null或非null。无论你如何始终如一地获得相同的价值观,除非文件明确说明必须具备的内容,否则不要依赖它。