Hat*_*end -3 c malloc pointers
我有一个2D LinkedList的结构我正在制作:
struct Node
{
void *data;
struct Node *up, *left, *right, *down;
};
Run Code Online (Sandbox Code Playgroud)
因为我已经习惯了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;
}
Run Code Online (Sandbox Code Playgroud)
我的程序在到达malloc第二段中的行时崩溃.如果我*从中删除malloc(sizeof(struct Node*))它,它不会崩溃并正常工作.
为什么是这样?我的buildNode函数只是返回一个指向a的指针Node,而实际上并没有返回Node结构本身.我得到的错误与腐败堆有关,因为我对C有点新,我不明白这一切意味着什么.
谢谢!
这一行:
struct Node *node = malloc(sizeof(struct Node*));
Run Code Online (Sandbox Code Playgroud)
分配一个指针大小的内存块(4或8个字节,具体取决于你是在32位还是64位模式下构建),并返回一个指向它的指针.这不是你想要的.
尝试访问返回对象的成员会导致未定义的行为,例如崩溃,因为您正在命中的内存超出了已分配空间的范围.您也可能默默地破坏堆,以便以后调用malloc导致崩溃.
鉴于:
struct Node *node = malloc(sizeof(struct Node));
Run Code Online (Sandbox Code Playgroud)
正在分配一个大小为的内存块struct Node- 这就是你想要的.
顺便说一句,您应该NULL在使用它之前检查返回的指针,然后优雅地处理错误.NULL如果分配失败,将返回A ,例如,如果内存不足.
另请注意,C(与Java不同)不是垃圾收集语言.您需要确保在某个时刻调用free您分配的每个指针,或者在程序终止之前不会释放内存.