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;
}
答案 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
的结束大小。