指针默认值。?
看,
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。 无论您如何始终如一地获得相同的价值观,除非文档明确说明必须具备的内容,否则请不要依赖它。