[英]pointer to pointers in C
我需要C語言中的指針幫助。我有兩個結構,如下所示:
typedef struct s{
s2** d;
struct s* next;
}s;
typedef struct s2{
c* fi;
struct s2* next;
}s2;
我有一個像這樣的功能:
void modify(c* a, s2* b){ //c* is a pointer to a struct
s* rd = malloc(sizeof(s);
rd->next = NULL;
//need also to initialize the field "d" of the "s" struct
}
這會產生錯誤。 在示例中,我需要結構rd指向b。 我需要存儲一個雙指針,因為s2以類似列表的方式鏈接,因此我需要**指針才能刪除列表的第一個元素。 我在rd-> d =&b之類的注釋中進行賦值,但是當我嘗試引用函數中的字段“ d”時,我讀取了無效的內存,並且我不明白為什么。
我想問題是這樣的:
您將s2* b
作為參數傳遞給modify
,因此該指針位於堆棧上。 現在,當你將rd->d = &b
,你走棧,直到執行離開的范圍僅是有效的該位置modify
。 因此,以后在取消對rd->d
引用時,將訪問堆棧上的該位置(現在無效),這將導致垃圾或崩潰。 (然而,在這種情況下,你應該能夠提領rd->d
正確,同時還在modify
。)
可能您想更改b
傳遞給modify的方式,最有可能傳遞給類似s2** b
類的東西,以便您可以正確地傳遞指向另一個結構中s2
的指針,而不是使其成為s2
的指針。坐在堆棧上進行modify
。
基本上是這樣的:
void modify(c* a, s2** b) {
s* rd = malloc(sizeof(s));
rd->next = NULL;
rd->d = b;
}
並稱它為
s2* myS2 = ...;
modify(<whatever>, &myS2->next);
這應該允許您將指針的位置傳遞到s2
實例,即使modify
完成(不過,未修改),您也可以保存和取消引用該實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.