首页 > 解决方案 > 尝试分配更多内存时重新分配错误

问题描述

我正在开发一个函数,其中数组的大小从 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 */
        }   
    }

我的错误:

在此处输入图像描述

标签: clinuxmallocrealloc

解决方案


总大小从 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以确定文件何时结束或是否发生错误。就目前而言,当其中任何一种情况发生时,您的程序将无限循环。


推荐阅读