c - 尝试分配更多内存时重新分配错误
问题描述
我正在开发一个函数,其中数组的大小从 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
以确定文件何时结束或是否发生错误。就目前而言,当其中任何一种情况发生时,您的程序将无限循环。
推荐阅读
- javascript - 在 webdriver.io 中使用相同的选择器获取所有元素的文本
- angular - 在访问本地静态文件之前重写 Angular 服务器中的 URL
- async-await - 如何等待订阅功能在角度 8 中完成?
- wildfly - 如何在 Wildfly 20 中启用 Infinispan smallrye 指标?
- rust - 如何解决“上游板条箱可能会添加新的 impl of trait”错误?
- biztalk - BizTalk 中的通用数据库
- python - 如何将 DurationField 的值转换为 QuerySet 中的微秒/分钟数?
- ruby - 尝试使用 ruby gems 打开/访问电子邮件附件中的文本
- html - SVG标签仅在 iPhone 上部分呈现
- azure - Azure Build Pipeline 无法发布工件