繁体   English   中英

尝试分配更多内存时重新分配时出错

[英]Error on realloc when try to allocate more memory

我正在开发一个函数,其中数组的大小以 10 开头,如果 fgets 的字符串变大,他需要分配更多的内存,但是当字符串太大时,我收到一个错误,就像我输入 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 个字节,为空终止符留出空间。 你现在做

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM