c-为什么我会出现内存泄漏(初始化时出现分段错误)


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;
}

相关内容

  • 没有找到相关文章

最新更新