【问题标题】:Realloc sets all indexes the same datarealloc 将所有索引设置为相同的数据
【发布时间】:2018-10-09 07:38:50
【问题描述】:
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 个索引。

有人可以帮帮我吗?

【问题讨论】:

  • 当然它们都是一样的,它们都指向同一个缓冲区。如果不想被下一行覆盖,则需要将数据从缓冲区中复制出来。 Realloc 做的正是它应该做的,但是这一行依次为每个索引分配了相同的值。 lines[counter] = nextline;

标签: c file realloc


【解决方案1】:

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

任务

lines[counter] = nextline;

只是分配指针,它不会做深拷贝或复制当前在nextline中的字符串。

您可能想要使用strdup 函数而不是仅仅分配指针:

lines[counter] = strdup(nextline);

以后记得freestrdup的字符串。

如果您知道数组和指针是如何交互的,那么简单的rubber duck debugging 应该会在几秒钟内告诉您这一点。如果你不明白你只是在分配指针,那么你需要回到你的课本或讲义。

【讨论】:

  • 问题确实如此。我不太擅长使用 C,但这是针对课程的。是的,我可以用最简单的方法来了解文件有多少行,但我不喜欢让它如此封闭,并且通过它我学到了其他东西。谢谢
猜你喜欢
  • 2019-04-14
  • 2021-11-27
  • 1970-01-01
  • 2015-01-12
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 2012-09-29
  • 2018-10-19
相关资源
最近更新 更多