获取核心转储释放由 getline() 分配的内存

Leo*_*eo 0 c

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

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);
Run Code Online (Sandbox Code Playgroud)

Dav*_*ica 5

在你写的,可动态分配内存的任何代码,你有2个职责关于分配的内存中的任何模块:(1)始终保持一个指针起始地址的内存,因此块,(2),可以释放时,它是没有不再需要。

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

当您尝试传递buff到 时free(),会发生错误,因为您正在尝试释放先前未由malloccalloc或分配的地址realloc

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