在我的程序中,我从.txt文件接收文本。以下是一行文字示例:
12X15 de3 ds4 dn9 g2,7 m5,9 m3,1 h2,2
我正在尝试使用strtok()来分解每个文本块;然后我将每个块作为元素放在一个数组中。所以是一个字符串数组。
到目前为止,这是我的代码:
void parseFile(char ** argv) {
FILE *textFile;
char *string;
char **lineToken;
int i;
textFile = fopen(argv[1], "r");
lineToken = malloc(sizeof(1));
string = malloc(sizeof(MAX_CHAR));
while(fgets(string, MAX_CHAR, textFile) != NULL) { /* Get first line of text */
lineToken[0] = strtok(string, " "); /* Put first element in lineToken[0] */
for(i = 1; i; i++) {
/* Realloc because total number of elements is unknown */
lineToken = realloc(lineToken, i + 1);
/* Put new strtok'd string into lineToken[i] */
lineToken[i] = strtok(NULL, " ");
}
for(i = 0; i; i++) {
move(i, 0);
printw("%s", lineToken[i]);
refresh();
}
}
free(lineToken);
free(string);
} /* End of function */
但我一直收到这个realloc错误:
*** glibc detected *** ./bin/a3RunMe: realloc(): invalid next size: 0x01f2a270 ***
Aborted
答案 0 :(得分:3)
这是最可能的问题:
lineToken = malloc(sizeof(1));
这里分配整数文字的大小,但lineToken
至少需要sizeof(*lineToken)
(或sizeof(char *)
)个字节。整数的大小和指针的大小可能不一样,特别是在64位平台上(其中int
是4个字节,指针是8个字节)。
所以当你这样做时
lineToken[0] = strtok(string, " ")
你写的不是分配的(缓冲区溢出)和覆盖分配器放在那里的数据。
realloc
调用也存在问题,该调用将分配i + 1
字节。因此,即使您使用的是32位平台(int
的大小恰好与指针的大小相同),您也会将指针从第一个字节重新分配为两个字节。迭代循环。
您还有其他问题,例如这些循环:
for(i = 1; i; i++)
请记住,在C中,所有非零值都为真,并且在该循环中i
何时为零?
答案 1 :(得分:1)
这个for
循环是无限的......
for(i = 1; i; i++)
{
lineToken = realloc(lineToken, i + 1); /* Realloc because total number of elements is unknown */
lineToken[i] = strtok(NULL, " "); /* Put new strtok'd string into lineToken[i] */
}
条件i
始终评估为TRUE
的{{1}}。
你可能会继续在循环中递增和分配,因此就是错误。