我在使用realloc打开内存时遇到问题。我正在尝试为从文件中读入的字符串数组动态分配内存。我想要做的是,使用fgets读取一行的前200个字符,如果那200个字符有新行,我继续下一行。我有这个工作很好,花花公子。我的问题是当前200个字符没有新行字符时,我试图将另外200个字符空间重新分配给字符串,然后将新的200个连接到旧字符串,直到它包含一个新行。经过测试,似乎在第二个realloc上,存在无效大小的glibc错误。
我称realloc错了吗?我已经阅读了手册页并将其用作参考,我用于参考的书说,因为它是sizeof(char),所以我不需要实际包含大小。谁能指出我哪里出错?我非常感谢你的帮助。
while( (!feof(file)) && lineCount < 11999 ) { //will loop til end of file
lines[index] = malloc(201*sizeof(char)); //give 201 spaces for the pointer at index
fgets(lines[index], 200, file); //gets first 200 chars
temp = strchr(lines[index], '\n'); //set temp for while loop
while(temp == NULL){ //while the string doesnt have \n
printf("string doesn't have have a newline character\n");
lines[index]=realloc(lines[index],200); //lines[index] now has 200 extra space
printf("added extra space\n");
fgets(temp2,200,file); //read next 200 chars into temp
printf("%s",temp2); //for testing print next 200 lines
temp=strchr(temp2,'\n'); //for while loop, check if temp has "\n"
strcat(lines[index],temp2); //concat string onto end
printf("This is lines after cat\n\n\n%s",lines[index]); //testing print
}//variables are iterated here
}
再次感谢您的时间和帮助。
编辑:在下面回答
答案 0 :(得分:2)
转移评论以回答。
realloc()
的大小参数是新的总大小,而不是大小的增量或减量。
因此,当您反复拨打realloc(lines[index], 200)
时,您不会增加空间。
另请注意使用方法:
pointer = realloc(pointer, new_size);
很危险,因为如果realloc()
失败,你就会丢失指向以前分配的内存的指针,从而泄漏内存。虽然它是详细的,你应该使用:
void *new_space = realloc(pointer, new_size);
if (new_space == 0)
…handle error…
pointer = new_space;
请注意,我已选择INC_SIZE
和MAX_LINES
以便于测试(30个字符比200个更容易; 5个线条比12,000个容易)。还要注意,代码在成功读取数据后立即回复其输入;这有助于调试代码。它还将字符串括在尖括号中,以便更容易知道字符串末尾的位置。这有时可以揭示诸如Unix机器上的CRLF(DOS)行结尾等问题。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum { INC_SIZE = 30 };
enum { MAX_LINE = 5 };
int main(void)
{
char *lines[MAX_LINE] = { 0 };
int lineCount = 0;
for (lineCount = 0; lineCount < MAX_LINE; lineCount++)
{
size_t lineSize = INC_SIZE;
lines[lineCount] = malloc(lineSize * sizeof(char));
if (lines[lineCount] == 0)
break;
if (fgets(lines[lineCount], INC_SIZE, stdin) == NULL)
break;
printf("In-1 <<%s>>\n", lines[lineCount]);
char *temp = strchr(lines[lineCount], '\n');
while (temp == NULL)
{
printf("string doesn't have have a newline character\n");
size_t newSize = lineSize + INC_SIZE;
void *newSpace = realloc(lines[lineCount], newSize);
if (newSpace == NULL)
break;
lines[lineCount] = newSpace;
lineSize = newSize;
printf("added extra space\n");
char temp2[INC_SIZE];
if (fgets(temp2, INC_SIZE, stdin) == NULL)
break;
printf("In-2 <<%s>>\n", temp2);
temp = strchr(temp2, '\n');
strcat(lines[lineCount], temp2);
printf("This is the line after cat: <<%s>>\n", lines[lineCount]);
}
}
for (int i = 0; i < lineCount; i++)
printf("Line: <<%s>>\n", lines[i]);
for (int i = 0; i < lineCount; i++)
free(lines[i]);
return 0;
}