簡體   English   中英

指向C中的指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM