如何解决尝试分配更多内存时重新分配时出错
我正在开发一个函数,数组的大小以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个字节,为空终止符留出了空间。你现在要做
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
的返回值以确定文件何时结束或是否发生错误。就目前而言,当任何一种情况发生时,您的程序将无限循环。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。