我有一个正在制作的2D LinkedList的结构:
struct Node
{
void *data;
struct Node *up, *left, *right, *down;
};
由于我习惯了Java,我制作了一个函数,它假装是一个构造函数,看起来像:
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
的指针,实际上并没有返回Node
结构本身。我得到的错误与损坏堆有关,由于我对C有些陌生,我不明白这一切意味着什么。
谢谢!
此行:
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
,否则在程序终止之前不会释放内存。