尝试分配更多内存时 realloc 出错

Error on realloc when try to allocate more memory

我正在开发一个函数,其中数组的大小从 10 开始,如果 f 的字符串更大,他需要分配更多内存,但是当字符串太大时,我得到一个错误,就像我输入一些东西一样有 15 个字符没问题,但是有 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 */
        }   
    }

我的错误:

总大小从 10 开始。您可以

fgets(readpos, bufSize, stdin);

在第一次迭代中,readpos 指向缓冲区的开始,所以这没问题。假设读取了 9 个字节,将 space 留给空终止符。你现在做

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 个字节,从而导致未定义的行为。

可能您想单独计算实际已读取的字节数,并使用它来计算缓冲区中剩余的 space,您将把它传递给 fgets

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