簡體   English   中英

訪問指向結構體指針的指針中的成員

[英]Accessing members in a pointer to a pointer of a struct

代碼如下:

/* set.h */
struct setElement{
  char *element;
  setElement *next;
};

typedef struct setElement *Set;  //Set is now the equivalent of setElement*

Set a;    

setInit(&a);

/* setInit function declaration @ setInit.c */

int setInit(Set *a){
  (*a)->element = "asdf";  //results in a seg fault
}

嘗試malloc'a'有效,但是如果我嘗試訪問集合'a'中的任何成員都行不通。 我知道我正在將對set的引用從main()函數傳遞給setInit,因此我相信setInit中包含的指針正在尋址main()函數中“ Set a”分配的內存,因此malloc不會不需要...

no野 感謝您的幫助:)

問題是您尚未分配要分配給的setElement 在代碼的主要部分中,您將創建一個Set ,它只是一個指向setElement的指針。 此指針永遠不會設置為指向任何明智的指針。 即您需要類似的東西

Set a = malloc(sizeof(setElement));

las,尚不清楚您的變量的確切定義位置。 我認為你的main.c就像

#include "set.h"

Set a;    

int main()
{
    setInit(&a);
}

如果是這樣,您的a(本身就是一個指針)應該指向某個地方。

如果您的框架需要malloc() ed數據,則應該這樣做

int main()
{
    a = malloc(sizeof(*a)); // *a is a struct setElement now, with 2 pointer-sized members.
    setInit(&a); // Now seInit should be able to operate on the struct as wanted.
}

正如@amaurea所提到的,您需要在setElement結構中使用malloc()。 除此之外,您還需要對setElement結構的element成員執行相同的操作。 char*僅僅是指向char或char數組的指針,不會隱式分配任何內容。

int setInit(Set *a){
  (*a)->element = "asdf";  //results in a seg fault
}

可以改寫

int setInit(Set *a){
  (*a)->element = malloc(sizeof("asdf"));
  strcpy((*a)->element,"asdf");
}

以上內容可以重寫為采用實際element內容的第二個參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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