我有一个2D LinkedList的结构我正在制作:
y
因为我已经习惯了Java,所以我创建了一个假装成构造函数的函数,它看起来像:
struct Node
{
void *data;
struct Node *up, *left, *right, *down;
};
我的程序在到达第二段中的struct Node* buildNode(void *data)
{
struct Node *node = malloc(sizeof(struct Node*)); // Program crashes here.
node->data = data;
node->up = NULL;
node->left = NULL;
node->right = NULL;
node->down = NULL;
return node;
}
行时崩溃。如果我从malloc
中移除*
,它就不会崩溃并且无法正常运行。
这是为什么?我的malloc(sizeof(struct Node*))
函数只是返回一个指向buildNode
的指针,实际上并没有返回Node
结构本身。我得到的错误与损坏的堆有关,因为我对C有点新,我不明白这一切意味着什么。
谢谢!
答案 0 :(得分:9)
这一行:
struct Node *node = malloc(sizeof(struct Node*));
正在分配指针大小的内存块(4或8个字节,具体取决于您是以32位还是64位模式构建),并返回指向它的指针。这不是你想要的。
尝试访问返回对象的成员会导致未定义的行为,例如崩溃,因为您正在命中的内存超出了已分配空间的范围。您可能还会以静默方式破坏堆,以便稍后调用malloc
会导致崩溃。
鉴于:
struct Node *node = malloc(sizeof(struct Node));
分配一个大小为struct Node
的内存块 - 这就是你想要的。
顺便说一句,你应该在使用之前检查返回的指针不是NULL
,然后优雅地处理错误。如果分配失败,将返回NULL
,例如,如果内存不足。
另请注意,C(与Java不同)不是垃圾收集语言。您需要确保在某个时刻在您分配的每个指针上调用free
,或者在程序终止之前不会释放内存。