使用malloc在for循环中创建链接列表始终返回相同的地址

时间:2017-03-09 06:14:55

标签: c for-loop linked-list malloc

我正在创建一个带有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

任何人都有这方面的线索吗?

2 个答案:

答案 0 :(得分:5)

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

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

这就是说,只是一句忠告,尽管是一个片段,但你错过了free()次电话。它导致内存泄漏。

答案 1 :(得分:2)

您正在打印&newnode。这是指针的地址。这将永远是相同的。

指针newnode中的值会发生什么变化。

如果您打印

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

每次都应该按预期获得不同的值。