【问题标题】:Creating a linked list in a for loop with malloc always returns the same address使用 malloc 在 for 循环中创建链表总是返回相同的地址
【发布时间】:2017-03-09 06:14:54
【问题描述】:

我正在创建一个带有 for 循环的链表,并在 for 循环中执行 malloc。我遇到的问题是在 for 循环内部,malloc 总是返回相同的内存地址!

我认为它应该在每次迭代时返回一个不同的地址,以便我可以链接节点。当前输出意味着程序总是覆盖相同的地址,我无法链接节点,因为一直只有一个节点。对吗?

struct list_node {
    char *id;
    char *url;
    struct list_node *next;
};
int main(void) {
    int j;
    for (j = 0; j < 5; j++) {
        struct list_node *new_node = malloc(sizeof(struct list_node));
        printf("No %d has address %p\n", j, &new_node);
    }
}

=> 
No 0 has address 0x7fff5db122b0
No 1 has address 0x7fff5db122b0
No 2 has address 0x7fff5db122b0
No 3 has address 0x7fff5db122b0
No 4 has address 0x7fff5db122b0

有人知道这件事吗?

【问题讨论】:

  • &amp;new_node --> new_node : new_node 保持malloc 的返回值。 &amp;new_node 是new_node 的地址,不是malloc 的返回值。
  • 您需要花时间来了解指针和指针之间的区别。什么持有和地址,以及该地址的内容。

标签: c for-loop linked-list malloc


【解决方案1】:

您正在打印&amp;new_node,即指针的地址,而不是指针本身。在您的情况下,&amp;new_node 是一个运行时的常量值。

如果要打印malloc() 返回的指针,只需提供变量new_node,并将其转换为void *。

也就是说,只是一个忠告,尽管你是一个 sn-p,但你错过了free() 的电话。这会导致内存泄漏。

【讨论】:

    【解决方案2】:

    您正在打印&amp;newnode。这是指针的地址。这将永远是一样的。

    会改变的是指针newnode中的值。

    如果你打印

    printf("No %d has address %p\n", j, new_node);
    

    您应该每次都得到不同的值,正如预期的那样。

    【讨论】:

      猜你喜欢
      • 2018-06-30
      • 1970-01-01
      • 2014-03-06
      • 1970-01-01
      • 2012-02-27
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多