C - Malloc崩溃/指针损坏的堆

时间:2016-07-29 06:40:52

标签: c pointers malloc

我有一个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有点新,我不明白这一切意味着什么。

谢谢!

1 个答案:

答案 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,或者在程序终止之前不会释放内存。