c - 获取核心转储释放由 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);
解决方案
在您编写的任何动态分配内存的代码中,您对分配的任何内存块都有两个责任:(1)始终保留指向内存块起始地址的指针,(2)它可以在没有时被释放更需要。
你在(1)中失败了,所以你不能做(2)。具体来说,正在发生的事情是getline()
分配存储并将分配块的起始地址分配给buff
. 然后,您可以使用buff
来遍历字符串调用*buff++
. 当您完成迭代时,buff
不再指向(保存起始地址)由getline()
.
当您尝试传递buff
到free()
时,会发生错误,因为您正在尝试释放以前未由或分配malloc
的地址。calloc
realloc
使用单独的指针进行迭代,例如char *p = buff;
在您的读取循环中并使用 进行迭代p
。(您也可以使用索引进行迭代,例如buf[i]
在不更改原始地址的情况下buff
保存)然后您可以传递buff
给free()
.
推荐阅读
- r - 如何在R中按组应用多个“if”函数
- java - 如何使用另一个数组列表提供的索引比较数组列表中的元素
- java - 服务器不听请求
- r - 数据框操作:变量操作
- c# - 在公共项目中使用 mimekit nuget 包(通过 paket)从引用公共项目的其他项目中删除现有 System.net.http.dll
- java - 如何调用 Ajax 请求以从数据库中获取记录并在页面加载时使用 servlet 在 jsp 上显示
- excel - 如何使用 putty 将多个命令传递给 VBA 中的 Shell 函数?
- python - 有没有办法让一个对象与 Python Turtle 中的另一个对象一起旋转?
- python-3.x - 使用 word2vec 确定最相似的短语
- android - 将 Fragment 与其在另一个 Fragment 中的更新链接