检查malloc';指定的指针为空

检查malloc';指定的指针为空,c,pointers,struct,C,Pointers,Struct,我有以下代码(这里简化了) #包括 #包括 结构内部{ INTA; int b; }; 结构外部{ 结构内部*next; 结构内部*prev; }; int main(int argc,char*argv[]){ 结构外部*c=malloc(sizeof(结构外部)); 如果(c->next){ printf(“此处\n”); } 如果(c->next!=NULL){ printf(“这里也是”); } } 如上所述,c只分配了内存,因此c->next和c->prev都是空地址。但这两种打印语

我有以下代码(这里简化了)

#包括
#包括
结构内部{
INTA;
int b;
};
结构外部{
结构内部*next;
结构内部*prev;
};
int main(int argc,char*argv[]){
结构外部*c=malloc(sizeof(结构外部));
如果(c->next){
printf(“此处\n”);
}
如果(c->next!=NULL){
printf(“这里也是”);
}
}
如上所述,
c
只分配了内存,因此
c->next
c->prev
都是空地址。但这两种打印语句仍在运行。仅当
c->next
不是空指针时,如何使
if
语句工作?

您的假设

如上所述,c只分配了内存,所以c->next和c->prev是空地址

这就是问题所在。虽然您确实为外部结构分配了内存,但不能保证它已初始化为0。指针可能指向垃圾地址

如果希望将它们设置为
NULL
,可以:

struct outer *c = malloc(sizeof(struct outer));
memset(c, 0, sizeof(struct outer));
A.
malloc()
不会将内存初始化为零,因此指针不一定是
NULL

B.访问未初始化的指针会导致未定义的行为


C.
C->next
C->next!=NULL
基本上是相同的条件检查

您还没有设置指向任何内容的指针。您只为它分配了空间,但没有初始化它


分配空间不会自动初始化任何内容。

您已使用
malloc()
分配内存,但这并不保证内存设置为零
如果您使用了
calloc()
,那么所有内存都会被设置为零,并且您会发现
c->next
c->prev
NULL

在检查分配内存中的任何成员之前,您应该检查malloc的指针是否为
NULL
。这意味着您必须在触摸任何成员之前,对照
NULL
检查
c
。未设置为
NULL
,如答案中所述。
struct outer *c = malloc(sizeof(struct outer));
memset(c, 0, sizeof(struct outer));