考虑以下代码:
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
这归结为四个问题:
- 如果我的猜测不正确,为什么我不使用 malloc() 它就不起作用?
- 为什么我的初始化不起作用?
- 初始化结构体是否会在堆栈上提供内存并解决我的问题?
- 如果没有,我是否有替代方法来为我使用的每个结构分配内存?
最佳答案
A struct
可以自动分配,但您使用的是指向 struct
的指针这不会为目标分配空间 struct
.这就是您遇到段错误的原因。
您的初始化不正确的原因是您正在初始化 struct
成员,而不是 struct
本身。你也以错误的方式这样做。
初始化 struct
有两种方法:
使用分配的堆栈
struct
:struct example { int foo; }; int main() { struct example e; e.foo=1; }
使用分配的堆
struct
在malloc()
的帮助下: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/