2014-10-05 105 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

    相关问题