c - 无效的旧大小重新分配错误,标准输入读取
问题描述
我正在尝试阅读标准输入。达到 n 个字符后,重新分配内存,虽然有 1 个主要问题和 1 个次要问题。重新分配错误“无效的旧大小:0x0000somenumers”发生在 1 或 2 次重新分配和“错误!!”之后 不打印。小问题是它在我按回车后写入字符数。
int maxchar = 80;
char *buffer = (char *) malloc(sizeof(char) * maxchar);
int counter = 0;
char *tmp;
while((*(buffer + counter) = getchar()) != EOF){
counter++;
if(counter == maxchar - 1){
tmp = (char *) realloc(buffer, sizeof(char) * (maxchar + maxchar));
if(tmp == NULL){printf("MISTAKE!!!\n");break;}
buffer = tmp;
maxchar += maxchar;
free(tmp);
printf("Maxchar is now: %d\n", maxchar);
}
}
buffer[counter] = '\0';
// some operations
printf("%s\n", buffer);
解决方案
随着任务
buffer = tmp
你有两个指针指向同一个内存。可以这样看:
+-----+ | 温度 | --\ +-----+ \ +--------------------------------+ >--> | realloc 分配的内存... | +--------+ / +--------------------------------+ | 缓冲 | --/ +--------+
由于您只有一个分配,因此调用
free(tmp);
将释放该单一分配。在那次打电话给free
你之后,你有类似的东西
+-----+ | 温度 | --\ +-----+ \ +----------+ >--> | 未分配的内存... | +--------+ / +------------------------+ | 缓冲 | --/ +--------+
这意味着任何取消引用都buffer
将无效,因为它也指向未分配的内存。当然,任何进一步的调用realloc
也是无效的,因为没有什么可以重新分配。
解决方案很简单:不要free
在循环中调用。
推荐阅读
- javascript - 如何让我的机器人获取已经从频道中的用户发送的随机消息,并在触发自动响应时发送该随机消息
- android - 关于 Android 上 BiometricPrompt 的一些问题
- javascript - 为什么一个功能有效,而另一个无效?
- django - 使用 Azure 应用服务中的连续部署选项部署 Django 时,db.sqlite3 被锁定
- java - 无法从数组中获得真正的价值,它只是说“NULL”
- python - numpy set_printoptions 不适用于 numpy.ma 数组
- sql - 如果不存在则插入,否则更新然后在旧记录上设置标志
- python - Python中的Flask分页帮助
- java - 如何将名称值对作为列表传递给java中的方法
- iphone - 未调用方法“场景(_:openURLContexts :)”