[英]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.