2017-06-20 42 views
-4

我被賦予了考試這個代碼,並在需要局部變量來解釋它做什麼: (我改變了一些名字,因爲源不是英語)指針和

#include <stdlib.h> 

typedef int typeInfoSCL; 
struct elemSCL 
{ 
    typeInfoSCL info; 
    struct elemSCL* next; 
}; 

typedef struct elemSCL TypeElemSCL; 
typedef TypeElemSCL* TypeSCL; 

void list_add(TypeSCL *scl, typeInfoSCL e) 
{ 
    TypeSCL tmp = *scl; 
    *scl = malloc(sizeof(struct elemSCL)); 
    (*scl)->info = e; 
    (*scl)->next = tmp; 
} 

int main() 
{ 
    TypeSCL scl1 = NULL; 
    list_add(&scl1, 3); 
    list_add(&scl1, 5); 
    TypeSCL tmp = malloc(sizeof(struct elemSCL)); 
    tmp->next = scl1; 
    list_add(&tmp, 7); 
} 

我想,既然tmplist_add一個局部變量,這樣的說法:

(*scl)->next = tmp; 

是不正確的,因爲該方法被調用後,scl->next不再存在。

測試證明我錯了。爲什麼?

+4

此代碼不能編譯,請張貼編譯代碼。你可能沒有正確地改變所有的名字。 –

+0

由於這是某種形式的僞代碼,而不是真正的C,它是不可能回答的問題。特別是,該函數的缺失返回類型使得任何嘗試回答都有所不同。 – Lundin

+0

我想你錯過了一些'*'這裏:'結構elemSCL未來;指針的' – Gerhardh

回答

2

而可變tmp是一個局部變量,與分配

(*scl)->next = tmp; 

你不(*scl)->next指向變量,而是你剛纔複製的tmp的內容(這是位置它指向的地方)變成(*scl)->next

分配後,您有兩個指針指向同一內存的兩個指針((*scl)->nexttmp)。當函數返回時和tmp超出範圍(*scl)->next仍將保持其價值和繼續指向相同的內存。

+0

難道你不認爲是因爲'struct elemSCL'有一個'struct elemSCL'成員而不是'struct elemSCL *',所以當我們創建一個'struct elemSCL'類型的變量時,程序最終會走出內存?我的意思是這也應該是問題之一。 –

+0

@GAURANGVYAS我認爲有很多,因爲OP的「翻譯」中顯示的文字錯別字。主要觀點仍然是,指針被複制,就像變量之間的任何其他賦值一樣。 –