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



我有一个正在制作的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,否则在程序终止之前不会释放内存。

相关内容

  • 没有找到相关文章

最新更新