struct node {
void *info;
struct node *nextNode;
}
struct linked {
struct node* Head;
struct node* Tail;
}
struct linked* pro[32]
void initialize_list()
printf("seg 1n");
for (int i = 0; i < 32; i++) {
if(!(pro[i] = (struct linked *) malloc(sizeof(struct linked)))) {
pro[i]->Head = pro[i]->Tail = NULL;
}
}
printf("seg 2n");
}
我不知道为什么,但当我调用主中的initialize_list((函数时
int main() {
initialize_list();
}
我有时会得到输出:
seg 1
segmentation fault
有时
seg 1
seg 2
有时,我的意思是,当我运行程序8次时,比如说,它可能在6次运行中以正确的输出运行,在2次运行中可能产生分段错误输出。你能帮我弄清楚这次初始化出了什么问题吗?我想,为什么它会泄露一些内存?
if(!(pro[i] = (struct linked *) malloc(sizeof(struct linked)))) {
应该是
if((pro[i] = (struct linked *) malloc(sizeof(struct linked)))) {
或者更好(不要投射malloc
(:
if((pro[i] = malloc(sizeof(struct linked)))) {
否则,当malloc
失败时,您会通知初始化成员
注意,您也可以使用calloc
,在这种情况下,不需要将成员初始化为NULL
:
for (int i = 0; i < 32; i++) {
pro[i] = calloc(1, sizeof(struct linked));
if (pro[i] == NULL) // And always check the return
{
perror("calloc");
exit(EXIT_FAILURE);
}
}
问题在于您的比较:
if(!(pro[i] = (struct linked *) malloc(sizeof(struct linked)))) {
pro[i]->Head = pro[i]->Tail = NULL;
}
只有当malloc
返回NULL时,此值才会计算为true。因此,如果条件为true,则表示您正在尝试取消引用NULL指针。这会调用未定义的行为,这意味着您的程序可能会崩溃,也可能不会崩溃。
相反,如果malloc
不返回NULL,则需要分配给pro[i]->Head
。此外,不需要强制转换malloc
的返回值。
if((pro[i] = malloc(sizeof(struct linked)))) {
pro[i]->Head = pro[i]->Tail = NULL;
}