我正在获取核心转储,我一直在寻找,似乎我做的一切都正确。
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)
在你写的,可动态分配内存的任何代码,你有2个职责关于分配的内存中的任何模块:(1)始终保持一个指针起始地址的内存,因此块,(2),可以释放时,它是没有不再需要。
你在(1)中失败了,所以你不能做(2)。具体来说,正在发生的是getline()分配存储并将分配块的起始地址分配给buff。然后buff,您可以用来遍历调用*buff++. 完成迭代后,buff不再指向(持有)分配的内存块(保存其起始地址)getline()。
当您尝试传递buff到 时free(),会发生错误,因为您正在尝试释放先前未由malloc、calloc或分配的地址realloc。
使用单独的指针进行迭代,例如char *p = buff;在您的读取循环中并使用p. (您也可以使用索引进行迭代,例如buf[i]不更改原始地址buff持有)然后您可以传递buff给free().