我需要返回一个字符串列表。从文件中读取这些字符串(文件的每行中的每个字符串)。下面的代码不能工作:
void getStrings(char **container, FILE* file, int *numberOfLetters) {
char* line = NULL;
size_t l = 0;
ssize_t r;
container = (char**) malloc (sizeof(char*));
size_t lettersNumber= 1;
size_t numberOfStrings = 0;
size_t sizeOfContainer = 1;
while ((r = getline(&line, &l, file)) != -1) {
line[strlen(line) - 1] = ' ';
lettersNumber = lettersNumber + strlen(line);
if (numberOfStirngs == sizeOfContainer) {
sizeOfContainer= sizeOfContainer * 2;
char** temp = calloc(sizeOfContainer, sizeof(char**));
for (int k = 0; k < l; k++) {
temp[k] = container[k];
}
free(container);
container = temp;
}
container[numberOfStrings] = line;
numberOfStrings++;
}
if (line) {
free(line);
}
因为您在每一步中都对整个指针数组进行了calloc
处理,因此您丢失了之前迭代中的所有字符串,并且始终只保留最后一行。由于您使用calloc
,所有这些指针都是空的,因此您的错误消息
预见到这些事情的工具是realloc
,而不是malloc
或calloc
,以保持您已经存储的值。
似乎还有其他问题。例如,你只有一个line
,你所有的行都被复制到那个,所以以前的行总是被覆盖。正如BLUEPIXY正确指出的那样,您只将函数参数的值更改为新值,而不会将新值返回给调用者。
那么,在每次迭代中重新分配内存是真正的浪费。你应该想出一个更有效的策略。