指针默认值。?

看,

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(ba != NULL) printf("a is not null\n"); else printf("a is null\n"); if(bb != NULL) printf("b is not null\n"); else printf("b is null\n"); 

输出是:

 a is not null b is not null 

为什么会这样?

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

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

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

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

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

  • 在第一种情况下,它恰好发生了malloc从擦除的页面返回内存(因此它包含0)
  • 在第二种情况下,堆栈上有东西,所以内存中包含垃圾

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