【发布时间】:2017-07-26 20:35:28
【问题描述】:
有些主题与此部分重叠,但我仍在寻求答案。
标记化部分工作正常,但动态内存分配似乎不是,基于取消注释打印循环时的段错误。
free() 只是检查 free() 是否有效,而不是完成函数的一部分,它会返回 NULL,直到它可以返回有意义的东西。
sep 通常是一个空格。行尾的任何 \n 在到达之前都会得到处理。
char ** chunkify(char *line, char *sep)
{
printf("%s\n", line);
char **array = malloc(sizeof(char *));
int token_count = 0;
char *token = NULL;
token = strtok(line, sep);
while( token != NULL )
{
printf("\t%s\n", token);
array = realloc(array,(token_count + 1) * sizeof(char *));
array[token_count] = malloc(strlen(token) + 1);
strcpy(array[token_count],token);
token = strtok(NULL, sep);
token_count++;
}
/*
int j;
for ( j=0 ; *(array+j) ; ++j)
{
printf("\t%s\n", *(array+j));
free(*(array+j)); // just to see if it frees cleanly
}
free(array);
*/
return NULL; // will return array when it's fixed
}
【问题讨论】:
-
malloc/strcpy可以替换为strdup。 -
*(array+j):NULL作为哨兵的区域没有被保护和存储。并添加调用者的代码。 -
@EugeneSh.,
strdup不在标准 C 语言中(但广泛使用),所以如果这是某种练习,这可能会有问题。 -
打印循环会尝试迭代,直到遇到一个 NULL 指针,但您不能确保列表末尾有一个 NULL 指针。
-
@FlorianWeimer-- it is POSIX,原来如此......
标签: c arrays malloc realloc strtok