realloc的问题 - "下一个大小无效"

时间:2014-03-14 05:33:51

标签: c realloc

在我的程序中,我从.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

2 个答案:

答案 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}}。

你可能会继续在循环中递增和分配,因此就是错误。