尝试分配更多内存时 realloc 出错
Error on realloc when try to allocate more memory
我正在开发一个函数,其中数组的大小从 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 个字节,将 space 留给空终止符。你现在做
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 个字节,从而导致未定义的行为。
可能您想单独计算实际已读取的字节数,并使用它来计算缓冲区中剩余的 space,您将把它传递给 fgets
。
另一个错误是您需要检查 fgets
的 return 值以确定文件何时结束或是否发生错误。就目前而言,当其中任何一种情况发生时,您的程序将无限循环。
我正在开发一个函数,其中数组的大小从 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 个字节,将 space 留给空终止符。你现在做
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 个字节,从而导致未定义的行为。
可能您想单独计算实际已读取的字节数,并使用它来计算缓冲区中剩余的 space,您将把它传递给 fgets
。
另一个错误是您需要检查 fgets
的 return 值以确定文件何时结束或是否发生错误。就目前而言,当其中任何一种情况发生时,您的程序将无限循环。