首页 > 解决方案 > 无效的旧大小重新分配错误,标准输入读取

问题描述

我正在尝试阅读标准输入。达到 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);

标签: c

解决方案


随着任务

buffer = tmp

你有两个指针指向同一个内存。可以这样看:

   +-----+
   | 温度 | --\
   +-----+ \ +--------------------------------+
               >--> | realloc 分配的内存... |
+--------+ / +--------------------------------+
| 缓冲 | --/
+--------+

由于您只有一个分配,因此调用

free(tmp);

将释放该单一分配。在那次打电话给free你之后,你有类似的东西

   +-----+
   | 温度 | --\
   +-----+ \ +----------+
               >--> | 未分配的内存... |
+--------+ / +------------------------+
| 缓冲 | --/
+--------+

这意味着任何取消引用都buffer将无效,因为它指向未分配的内存。当然,任何进一步的调用realloc也是无效的,因为没有什么可以重新分配。

解决方案很简单:不要free在循环中调用。


推荐阅读