Realloc将所有索引设置为相同的数据

时间:2018-04-28 18:15:25

标签: c file realloc

FILE *fd;
char **lines = NULL;

int err = fopen_s(&fd, filename, "r");

if (err != 0) {
    printf("Nao foi possivel abrir o ficheiro %s ...\n", filename);
    return;
}

char nextline[1024];
int counter = 0;

while (fgets(nextline, sizeof(nextline), fd)) {
    if (strlen(nextline) < 1) {
        continue;
    }

    lines = (char**)realloc(lines, (counter+1) * sizeof(*lines));
    lines[counter] = nextline;



    counter++;
}

fclose(fd);
*numElements = counter;

//IN HERE IT SHOWS ME THE SAME FOR ALL THE PLAYERS FROM 300 DIFFERENT PLAYERS WHY IS THAT???
printf_s("\n\n%s\n", lines[299]);
printf_s("%s\n", lines[298]);

我无法解决问题 第一个realloc是删除旧的缓冲区,现在它实际上是将相同的数据复制到所有300个索引。

有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:2)

变量lines基本上是一个指针数组。并且数组中的所有指针都指向同一个nextline数组的第一个元素。

作业

lines[counter] = nextline;

仅分配指针,它不会执行深层复制或复制当前nextline中的字符串。

您可能希望使用strdup函数而不只是分配指针:

lines[counter] = strdup(nextline);

请记住free以后的strdup字符串。

如果你知道数组和指针如何相互作用,一个简单的rubber duck debugging应该在几秒钟内告诉你。如果你不明白你只是指定指针,那么你需要回到你的教科书或讲义。