c - 为什么会出现内存泄漏(此初始化导致的段错误)?

标签 c memory-leaks linked-list segmentation-fault

struct node {
    void *info;
    struct node *nextNode;
}

struct linked {
    struct node* Head;
    struct node* Tail;
}

struct linked* pro[32]

void initialize_list()
     printf("seg 1\n");
     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 2\n");
}

我不知道为什么,但是当我在main中调用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);
     }
 }

关于c - 为什么会出现内存泄漏(此初始化导致的段错误)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65005504/

相关文章:

algorithm - 将排序链表转换为平衡二叉树未正确返回?

c++ - c++中动态分配的链表。发生异常后如何防止内存泄漏?

c++ - 将 C 程序链接到 C++ 共享库

c - 尽管返回 0,但 codechef 上出现 Nzec 错误

c - 如何计算二进制数C中的最大块长度

c - 注入(inject)的 dll 使所有者进程崩溃。为什么?

ios - NSMutableArray 中的 UIImages 导致 iPhone 应用内存泄漏

php - 填充 FosElasticaBundle 时 php 内存不足,可能存在内存泄漏?

node.js - 使用Node JS堆的Elasticsearch查询内存不足

c - 为什么带有双指针的链表会导致错误?