2017-03-09 25 views
0

我正在使用for循環創建鏈表並在for循環中執行malloc。我得到的問題是在for循環中,malloc總是返回相同的內存地址!使用malloc在for循環中創建鏈表始終返回相同的地址

我認爲它應該每次迭代都返回一個不同的地址,以便我可以鏈接節點。當前輸出意味着程序總是覆蓋相同的地址,並且我無法鏈接節點,因爲一直只有一個節點。這是對的嗎?

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 

任何人都有這方面的線索嗎?

+0

'&new_node' - >'new_node':'new_node'保持'malloc'的重試值。 'new_node'是'new_node'的地址,而不是'malloc'的重試值。 – BLUEPIXY

+1

你需要花時間去欣賞指針和指針之間的區別。什麼成立和解決,什麼是這個地址。 – StoryTeller

回答

5

您正在打印&new_node,指針的地址,而不是指針本身。在你的情況下,&new_node是一個運行時的常量值。

如果要打印由malloc()返回的指針,只需提供變量new_node,並將其轉換爲void *

這就是說,只是一個建議的話,儘管是一個片段,你錯過了free()調用。這導致內存泄漏。

2

您正在打印&newnode。這是指針的地址。這將永遠是一樣的。

改變的是指針newnode中的值。

如果打印

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

你應該每次得到不同的值,符合市場預期。