C realloc()char **"下一个大小无效"错误

时间:2014-10-30 18:11:48

标签: c realloc sigabrt

int parseString(char* input, char*** words, int* size) {
    char *word;

    *words = malloc(sizeof(char));
    word = strtok(input, " \n\t");

    while (word != NULL) {
        (*words)[*size] = malloc(sizeof(word) + 1);
        strcpy((*words)[*size], word);
        (*size)++;
        *words = realloc(*words, ((*size) + 1) * sizeof(char));
        word = strtok(NULL, " \n\t");
    }
    return 0;
}

我想收到一个字符串(input)并将其分成单词并存储单词。

在while循环中的第四次迭代(总是在第四次,从不更早),我在realloc(...)得到一个错误:

realloc(): invalid next size: 0x0000000001641010 ***
Aborted (core dumped)

在完成@TaylorBrandstetter和@chux的建议更改后,代码如下所示:

int parseString(char* input, char*** words, int* size) {
    char *word;

    *words = malloc(sizeof(char*));
    word = strtok(input, " \n\t");

    while (word != NULL) {
        (*words)[*size] = malloc(strlen(word) + 1);
        strcpy((*words)[*size], word);
        (*size)++;
        *words = realloc(*words, ((*size) + 1) * sizeof(char*));
        word = strtok(NULL, " \n\t");
    }
    return 0;
}

2 个答案:

答案 0 :(得分:0)

    *words = realloc(*words, ((*size) + 1) * sizeof(char));
    word = strtok(NULL, " \n\t");

strtok函数存储一个指针,指向它离开的位置,以便在您传递NULL作为第一个参数时可以恢复。但是你对realloc的调用使它存储的指针无效(因为它可以移动数据)。因此,您无法将NULL作为第一个参数传递。但你做到了。

答案 1 :(得分:0)

缺陷在于处理字符串:

(*words)[*size] = malloc(sizeof(word) + 1);
strcpy((*words)[*size], word);

sizeof(word)是4(嗯,它可能是别的东西,但它是指针的大小)。这需要strlen(word)代替:

(*words)[*size] = malloc(strlen(word) + 1);
strcpy((*words)[*size], word);

而且,正如@Taylor Brandstetter所提到的,*words的malloc太小了。实际上,在不知道输入中最大字数的情况下,在输入被解析一次之前,将无法知道*words的结束大小。

相关问题