2014-03-04 112 views
0

我有一個鏈表的結構,我想傳遞一個節點(另一個結構)指針指向一個函數(該節點是鏈表的一部分,但我將節點單獨傳遞給刪除器函數從堆棧內存中刪除結構

我希望它複製下一個節點數據到自身(覆蓋其數據),並刪除下一個節點,從而刪除自己(這部分工作)..我做了它檢查是否傳遞的節點是(我知道我可以使用malloc()和free()使用堆內存)。我不知道如何從堆棧中刪除結構(我知道我可以malloc()和free()它使用堆內存)。

#include <stdlib.h> 
#include <stdio.h> 

typedef struct { 
    int data; 
    struct node * next; 
}node; 

typedef struct { 
    struct node * head; 
}linked_list; 

void print_list(linked_list * list) { 

    node *current = list->head; 
    while (current) { 
     printf("Current node has %d\n",current->data); 
     current = current->next; 
    } 
} 

void delete_node(node * n) { 
    node * next = n->next; 
    if (next) { 
     n->data = next->data; 
     n->next = next->next; 
    } 
    else { 
     *n = NULL; /*This of course won't compile because assigning void* (null) to node variable 
           but if i make n point to NULL, nothing will happen because i'm inside a function 
           and the pointer is duplicated (the passed pointer will still work) */ 
    } 
} 

void main(){ 
    node first; 
    node second; 
    first.data = 1; 
    first.next = &second; 
    second.data = 2; 
    second.next = NULL; 
    linked_list l; 
    l.head = &first; 
    print_list(&l); 
    delete_node(&second); 
    print_list(&l); 
} 
+1

局部變量不會被刪除......您只需終止本地塊即可釋放該內存。 – mah

+0

但我傳遞一個函數的指針,我想刪除的變量不在該函數的範圍內。這是否意味着我根本無法做我想做的事情? – user2263786

+1

您可以從列表中取消鏈接,但不能刪除結構佔用的內存。您只能刪除首次分配的內容,並且通常以相同的方式刪除。由於您的分配是隱式的(通過啓動執行塊),您的釋放也將是隱式的(通過終止執行塊)。 – mah

回答

1

正如其他人所說,你不能

如果您希望能夠在列表中存儲已分配的(由malloc)和未分配的(靜態或自動)存儲對象,並具有從列表中刪除對象並釋放它們的「刪除」功能,您需要作爲每個列表成員的一部分存儲一個標誌,指示它是否在分配的存儲中,並且只釋放那些是已分配的存儲。

另請注意,如果自動存儲結構的使用期限在您從列表中移除之前終止,您將遇到很大麻煩!如果處理這個問題讓你感到困惑,那麼對於所有列表成員,使用分配的存儲空間(malloc)可能會更好。

0

不能:)

在大多數計算機體系結構,局部變量是直接裝在CPU寄存器或堆棧上分配。對於分配在堆棧上的局部變量,當函數進入時,堆棧的頂部(用於存放函數調用的返回地址的堆棧)被操縱以爲它們留出空間,並且它被恢復爲「釋放」當函數退出時的內存。所有這些堆棧管理都由編譯器自動處理。