我们必须malloc一个结构吗?

Spa*_*Guy 10 c malloc struct

请考虑以下代码:

struct Node {
    void* data;
    int ref;
    struct Node* next;
};
typedef struct Node* NodePtr;
Run Code Online (Sandbox Code Playgroud)

我发现每当我尝试使用NodePtr的字段做任何事情时,我都会遇到段错误.例如:

NodePtr node;
node->ref = 1;
Run Code Online (Sandbox Code Playgroud)

所以我为NodePtr分配了一些空间,现在它似乎工作正常.为什么是这样?我的猜测是,由于节点只是一个指针,它的字段没有内存.

所以我尝试初始化NodePtr:

NodePtr node = {
    node->data = 0;
    node->next = NULL;
    node->ref = 0;
};
Run Code Online (Sandbox Code Playgroud)

好吧,我收到了这个错误:

error: expected â}â before â;â token
Run Code Online (Sandbox Code Playgroud)

这归结为四个问题:

  1. 如果我的猜测不正确,如果我不使用malloc(),为什么它不起作用?
  2. 为什么我的初始化不起作用?
  3. 初始化一个struct会在堆栈上提供内存并解决我的问题吗?
  4. 如果没有,我是否可以为我使用的每个结构分配内存?

ali*_*_fn 22

A struct可以自动分配,但您使用的指针struct不会为目标分配空间struct.这就是你得到段错误的原因.

初始化不正确的原因是您正在初始化struct 成员,而不是struct自身.你也是以错误的方式做这件事.

初始化有两种方法struct:

  1. 使用堆栈分配struct:

    struct example {
      int foo;
    };
    int main() {
      struct example e;
      e.foo=1;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用struct在以下帮助下分配的堆malloc():

    struct example {
      int foo;
    };
    int main() {
      struct example *e=malloc(sizeof(struct example));
      e->foo=1;
    }
    
    Run Code Online (Sandbox Code Playgroud)

请注意,当您struct从其指针(堆分配struct)中为a成员分配值时,您必须使用' ->'但是对于普通结构(堆栈分配了一个),您必须使用' .'.