【问题标题】:Error on realloc when try to allocate more memory尝试分配更多内存时重新分配错误
【发布时间】:2021-01-30 01:06:13
【问题描述】:

我正在开发一个函数,其中数组的大小从 10 开始,如果 f 的字符串变得更大,他需要分配更多的内存,但是当字符串太大时,我得到一个错误,就像我用 15 输入的东西一样chars 没问题,但是 30 我得到了错误!我不知道为什么。所以希望你能告诉我。

-= 已解决此代码 =-

我的主要:

char *buf;

shellExecute(&buf);

我的代码:

 char* shellExecute(char** buf){
    
        int bufSize = 10;
        *buf = malloc(bufSize * sizeof(char));
        if(*buf == NULL){
            printf("[ERROR] can't malloc %d bytes\n", bufSize);
            exit(0);
        }
        char *readpos = *buf;
        
        while (1){  
        
        fgets(readpos, bufSize, stdin);
    
        /* Search from the end, as there's where the newline should be */
            if (readpos[strlen(readpos)-1] == '\n'){
                break;
            }   
    
        /* Need to allocate more memory */
             bufSize += bufSize;
             *buf = realloc(*buf, *buf + strlen(*buf) * sizeof(char));
    
        /* Set the pointer to next position to read into */
            readpos = *buf + strlen(*buf);
        /* Loop takes case of trying again */
        }   
    }

我的错误:

【问题讨论】:

  • 使用调试器并单步调试代码......
  • 如果你还是return *buf,传递char** 有什么意义?
  • @KamilCuk 那不是问题,因为,我已经有一个 void func 并且仍然有错误
  • 请不要使用您的固定代码编辑问题和/或答案。它们仅在涉及错误代码时才有意义,并且可以帮助那些自己有类似错误代码的人。如果您想更新解决问题的方法,请发布您自己的答案。
  • @NateEldredge 好的,谢谢

标签: c linux malloc realloc


【解决方案1】:

总大小从 10 开始。你做

fgets(readpos, bufSize, stdin);

在第一次迭代中,readpos 指向缓冲区的开头,所以这很好。假设读取了 9 个字节,为空终止符留出空间。你现在做

bufSize += bufSize;
*buf = realloc(*buf, bufSize * sizeof(char));

所以现在bufSize 是 20,*buf 的总大小是 20。接下来你做

readpos = *buf + strlen(*buf);

所以readpos 现在指向*buf+9

您的下一个fgets 将尝试将 20 字节读入总大小为 20 的缓冲区,但从偏移量 9 开始,超出该偏移量只有 11 个字节可用。这可能会超出缓冲区 9 个字节,从而导致未定义的行为。

您可能希望单独计算实际读取的字节数,并使用它来计算缓冲区中剩余的空间,然后将其传递给fgets

另一个错误是您需要检查fgets 的返回值以确定文件何时结束或是否发生错误。就目前而言,当其中任何一种情况发生时,您的程序将无限循环。

【讨论】:

  • 所以,我需要重新表述这个readpos = *buf + strlen(*buf);readpos = *buf;?
  • @prt05:这将避免缓冲区溢出,但是您将用新数据覆盖先前读取的数据,而不是追加,我认为这不是您想要的。跨度>
猜你喜欢
  • 2020-04-24
  • 2020-03-29
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 2022-12-12
  • 1970-01-01
  • 2017-11-21
  • 1970-01-01
相关资源
最近更新 更多