我们必须malloc一个结构吗?
考虑下面的代码:我们必须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
这归结为四个问题:
- 如果我的猜测是不正确的,如果我不使用malloc(),为什么它不工作?
- 为什么我的初始化不起作用?
- 将初始化一个结构体提供栈上的内存并解决我的问题?
- 如果没有,我有替代方案必须为我使用的每个结构分配内存吗?
一个struct
可以自动分配的,但你用的是指针struct
这将不为目的地分配空间struct
。所以这就是你陷入段错误的原因。
的原因,你的初始化是不正确的是,要初始化struct
成员,而不是struct
本身。你也是以一种错误的方式来做这件事。
有两种方法用于初始化struct
:
-
使用堆栈中分配
struct
:struct example { int foo; }; int main() { struct example *e=malloc(sizeof(struct example)); e->foo=1; }
struct example {
int foo;
};
int main() {
struct example e;
e.foo=1;
}
使用堆与malloc()
帮助分配
请注意,当你从它的指针struct
的成员分配值(堆上分配struct
),你必须使用“->
”,但对于正常的结构(在堆栈中分配一个),你必须使用“.
” 。
你的假设是正确的:一个指针没有记忆它应该指向它自己的对象,你需要自己分配它。
无论如何,正如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);
你尝试过其他的语法是不正确。甚至不是该语言的一部分。
指针不是结构体。这是一个告诉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
它应该是有道理的,你可以用字符串来完成。 – potrzebie 2014-10-05 20:53:18
@potrzebie'char * x =“...”'?这是句法糖,它仍然是一个数字,字符串存储在其他地方。是否是降低投票的原因(如果是你)? – itdoesntwork 2014-10-05 21:03:38
你不需要'malloc'。例如,'struct Node n = {NULL,42,NULL};'。你只是在各地都有语法错误。 – juanchopanza 2014-10-05 20:05:45
如果您正在创建非指针对象,则不需要分配内存。 – Ares 2014-10-05 20:05:59
您的'NodePtr'初始化甚至不是正确的C语法,这不可能是您尝试的代码。 – 2014-10-05 20:06:11