2014-10-05 129 views
5

考慮下面的代碼:我們必須malloc一個結構嗎?

struct Node { 
    void* data; 
    int ref; 
    struct Node* next; 
}; 
typedef struct Node* NodePtr; 

我發現我越來越段錯誤,每當我嘗試做NODEPTR的田地什麼。例如: -

NodePtr node; 
node->ref = 1; 

所以我分配給NODEPTR一些空間,現在它似乎很好地工作。爲什麼是這樣?我的猜測是,由於節點只是一個指針,它的字段沒有內存。

於是,我就初始化NODEPTR:

NodePtr node = { 
    node->data = 0; 
    node->next = NULL; 
    node->ref = 0; 
}; 

和好了,我得到這個錯誤:

error: expected â}â before â;â token 

這歸結爲四個問題:

  1. 如果我的猜測是不正確的,如果我不使用malloc(),爲什麼它不工作?
  2. 爲什麼我的初始化不起作用?
  3. 將初始化一個結構體提供棧上的內存並解決我的問題?
  4. 如果沒有,我有替代方案必須爲我使用的每個結構分配內存嗎?
+0

你不需要'malloc'。例如,'struct Node n = {NULL,42,NULL};'。你只是在各地都有語法錯誤。 – juanchopanza 2014-10-05 20:05:45

+2

如果您正在創建非指針對象,則不需要分配內存。 – Ares 2014-10-05 20:05:59

+1

您的'NodePtr'初始化甚至不是正確的C語法,這不可能是您嘗試的代碼。 – 2014-10-05 20:06:11

回答

17

一個struct可以自動分配的,但你用的是指針struct這將不爲目的地分配空間struct。所以這就是你陷入段錯誤的原因。

的原因,你的初始化是不正確的是,要初始化struct成員,而不是struct本身。你也是以一種錯誤的方式來做這件事。

有兩種方法用於初始化struct

  1. 使用堆棧中分配struct

    struct example { 
        int foo; 
    }; 
    int main() { 
        struct example *e=malloc(sizeof(struct example)); 
        e->foo=1; 
    } 
    
01:

struct example { 
    int foo; 
}; 
int main() { 
    struct example e; 
    e.foo=1; 
} 
  • 使用堆與malloc()幫助分配

    請注意,當你從它的指針struct的成員分配值(堆上分配struct),你必須使用「->」,但對於正常的結構(在堆棧中分配一個),你必須使用「.」 。

  • 1

    你的假設是正確的:一個指針沒有記憶它應該指向它自己的對象,你需要自己分配它。

    無論如何,正如juanchopanza指出的那樣:如果處理本地對象,則不需要指針和內存分配。

    這兩種技術如下:

    typedef struct Node { 
        void* data; 
        int ref; 
        struct Node* next; 
    } Node; 
    typedef struct Node* NodePtr; 
    
    int main() { 
    
         NodePtr node = (NodePtr)malloc(sizeof(Node)); 
         node->data = 0; 
         node->next = 0; 
         node->ref = 42; 
         printf("%d", node->ref); 
    
         Node obj = {0,42,0}; // this is not on the heap 
         printf("%d", obj.ref); 
    

    你嘗試過其他的語法是正確。甚至不是該語言的一部分。

    2

    指針不是結構體。這是一個告訴C結構在內存中的位置的數字。任何類型爲NodePtr的變量本質上都是一個數字。

    那麼,如何將一個NodePtr類型的變量設置爲結構?結構不是數字!

    當你用NodePtr node聲明它時,它可能被設置爲某個未定義的值,例如0.你不能訪問導致段錯誤的內存。取而代之的是,您可以找到一些與malloc()配合使用的內存,並在那裏使用該字段的變量點。


    要到potrzebie的評論作出迴應,似乎與字符串的工作,但說真的只是語法糖:

    #include <stdio.h> 
    
    int main() { 
        char *a = "Does this make sense?"; 
        printf("%d\n", a); // %u is the correct one, but this is for illustrational purposes 
    
        return 0; 
    } 
    
    
    > test.exe 
    4214884 
    
    +0

    它應該是有道理的,你可以用字符串來完成。 – potrzebie 2014-10-05 20:53:18

    +0

    @potrzebie'char * x =「...」'?這是句法糖,它仍然是一個數字,字符串存儲在其他地方。是否是降低投票的原因(如果是你)? – itdoesntwork 2014-10-05 21:03:38