指针默认值。?

时间:2011-08-30 08:10:01

标签: c pointers

看,

  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

为什么会这样?

4 个答案:

答案 0 :(得分:39)

指针没有默认值。他们拥有的价值就是他们现在使用的内存中的垃圾。有时特定的编译器会将内存清零,但这不是标准的,所以不要指望它。)

来自malloc的内存为NULL是巧合;它可能是任何其他价值同样容易。您需要并且应该始终手动将所有指针设置为NULL。

另一种选择是你也可以使用calloc,它与malloc做同样的事情,但是在它给你的内存块中将所有位设置为0。这对堆栈变量没有帮助,所以你仍然必须自己将它们设置为NULL。

答案 1 :(得分:7)

这完全依赖于操作系统,没有说明指针指向何种情况,因为没有指定。无论如何,你应该始终将指针设置为NULL。

答案 2 :(得分:3)

机会,这就是发生的事情。没有人说未初始化的非静态内存需要保留任何值。两者都可以包含任何内容。

  • 在第一种情况下,malloc只返回了内存 从一个已删除的页面(所以它包含0)
  • 在第二种情况下,堆栈上有东西,所以内存中包含垃圾

答案 3 :(得分:2)

在这两种情况下,temp的内容都是未初始化(随机)数据。它们可以为null或非null。无论你如何始终如一地获得相同的价值观,除非文件明确说明必须具备的内容,否则不要依赖它。