c - 我们必须 malloc 一个结构吗?

标签 c struct 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. 如果没有,我是否有替代方法来为我使用的每个结构分配内存?

最佳答案

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

您的初始化不正确的原因是您正在初始化 struct 成员,而不是 struct本身。你也以错误的方式这样做。

初始化 struct 有两种方法:

  1. 使用分配的堆栈 struct :

    struct example {
      int foo;
    };
    int main() {
      struct example e;
      e.foo=1;
    }
    
  2. 使用分配的堆 structmalloc()的帮助下:

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

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

关于c - 我们必须 malloc 一个结构吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26206667/

相关文章:

c - Malloc( ) - 在新页面请求或重新循环先前分配的内存之间做出决定

c - 我如何使用 malloc 在 C 中创建矩阵并避免内存问题?如何使用 C99 语法将矩阵传递给函数?

c - 使用 malloc 的结构数据对齐

c - 整数相除没有结果

c - 循环读取数组输入意外行为?

c - 二维数组初始化

C++ 结构指针数组

c++ - 数据文件输入/输出错误

c - 如何调用WM_SETREDRAW?

c - 如何使用指针传递结构的二维数组