我有以下代码(此处已简化)。
#include <stdio.h>
#include <stdlib.h>
struct inner {
int a;
int b;
};
struct outer {
struct inner *next;
struct inner *prev;
};
int main(int argc, char *argv[]) {
struct outer *c = malloc(sizeof(struct outer));
if (c->next) {
printf("here\n");
}
if (c->next != NULL) {
printf("here too");
}
}
如上所示,c
仅分配了内存,因此c->next
和c->prev
为NULL地址。但两份印刷报表仍然有效。仅当if
不是空指针时,如何使c->next
语句起作用?
答案 0 :(得分:5)
一个。 malloc()
未将内存初始化为零,因此您的指针不一定是NULL
B中。访问未初始化的指针会导致未定义的行为
℃。 c->next
和c->next != NULL
基本上是相同的条件检查
答案 1 :(得分:5)
您已使用malloc()
分配内存,但不保证内存设置为零
如果您使用过calloc()
,那么所有内存都会被设置为零,您会找到c->next
和c->prev
到NULL
答案 2 :(得分:1)
你的假设
如上所示,c只分配了内存,因此c-&gt; next和c-&gt; prev是NULL地址
是个问题。虽然您确实为外部结构分配了内存,但无法保证它已初始化为0。指针可能指向垃圾地址。
如果你想让它们为NULL
,你可以:
struct outer *c = malloc(sizeof(struct outer));
memset(c, 0, sizeof(struct outer));
答案 3 :(得分:1)
您尚未将指针设置为任何内容。您只为其分配了空间,但未初始化。
分配空间不会自动初始化任何内容。