【问题标题】:Passing char* to singly listed list changes all its elements [closed]将 char* 传递给单独列出的列表会更改其所有元素 [关闭]
【发布时间】:2018-09-10 21:00:49
【问题描述】:

我已将问题缩小到这个非常具体的细节,但我仍然无法找到解决方案。我有点感觉为什么会发生这种情况,但是对于指针来说是新手,我不知道如何解决它。

所以我有一个单链表,其中一个函数可以将元素添加到它的开头,另一个函数可以列出其元素。两者都工作正常。

我想通过一个循环,将不同的值传递给char *variable,然后使用insert(variable) 函数将其添加到单链表中。

这是我得到的行为:

    variable = "aa";
    insert(variable);
    list();

List: aa

    variable = "aa";
    insert(variable);
    variable = "bb";
    insert(variable);
    list();

List: bb bb

    variable = "aa";
    insert(variable);
    variable = "bb";
    insert(variable);
    variable = "cc";
    insert(variable);
    list();

List: cc cc cc

显然想要的结果是:List: cc bb aa。为什么会这样?

代码:

    while (fgets(word_in_file, LENGTH, file) != NULL) {
        word_to_add = malloc((LENGTH) * sizeof(char));
        strcpy(word_to_add, word_in_file);
        insert(word_to_add);
    }

谢谢!

【问题讨论】:

  • 显然你的代码在某种程度上被破坏了。没有看到代码我们不能说更多。
  • 你应该添加你如何实现insert()list()

标签: c pointers char singly-linked-list


【解决方案1】:

您的问题是您使用的是指向相同内存位置的相同 char 指针。因此,您输入的最后一个值将反映在所有地方。最好在每次输入值之前动态分配内存。

只需添加以下代码行:-

variable = malloc(3);
strcpy(variable, "aa");
insert(variable);
variable = malloc(3);
strcpy(variable, "bb");
insert(variable);
variable = malloc(3);
strcpy(variable, "cc");
insert(variable);

现在你会得到aa、bb、cc

另外不要忘记释放动态分配的内存。

【讨论】:

  • 完美!非常感谢。我有点知道这是问题所在,但我仍然不知道该怎么办。
  • 在这种情况下,我该如何释放内存? free(variable) 只会释放用于最后一个 malloc 的内存。
  • @Victor,您必须在程序末尾使用insert(variable); 分配指针的变量使用free。可能您必须使用一个函数,通过该函数您需要在程序结束时释放内存。
  • 我的意思是 variable = malloc(); insert(variable) 在我的循环中会被调用数千次。据我了解,每次调用后我都无法释放内存(或者会发生 OP 中描述的行为)。所以我必须释放循环外的内存。有没有办法释放所有这些电话?
  • 我在OP上添加了代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 2018-05-27
  • 2019-11-06
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
相关资源
最近更新 更多