首页 > 解决方案 > 获取核心转储释放由 getline() 分配的内存

问题描述

我正在获取核心转储,我一直在寻找,似乎我做的一切都是正确的。

int len = 0;
char *buff = NULL;
size_t sz;
if(getline(&buff,&sz, stdin) > 0){
    while(isalpha(*buff++))
        ++len;
       printf(" 1st word %d characters long ",len);
}
free(buff);

标签: c

解决方案


在您编写的任何动态分配内存的代码中,您对分配的任何内存块都有两个责任:(1)始终保留指向内存块起始地址的指针,(2)它可以在没有时被释放更需要。

你在(1)中失败了,所以你不能做(2)。具体来说,正在发生的事情是getline()分配存储并将分配块的起始地址分配给buff. 然后,您可以使用buff来遍历字符串调用*buff++. 当您完成迭代时,buff不再指向(保存起始地址)由getline().

当您尝试传递bufffree()时,会发生错误,因为您正在尝试释放以前未由或分配malloc的地址。callocrealloc

使用单独的指针进行迭代,例如char *p = buff;在您的读取循环中并使用 进行迭代p。(您也可以使用索引进行迭代,例如buf[i]在不更改原始地址的情况下buff保存)然后您可以传递bufffree().


推荐阅读