为什么对结构使用 malloc 时会出现分段错误 11?
Why Do I get a segmentation fault 11 using malloc for a struct?
我是 C 的新手,我自己通过麻省理工学院开放课件进行实用的 C 编程 (MIT OCW Homepage),以便学习一些 C 基础知识。
在作业 5 中,我们应该实现一个用于分配、释放、显示和遍历的小型二叉树库。
在测试以下实现时
#include <stdlib.h>
struct TreeNodeStruct {
int data ;
struct TreeNodeStruct *left, *right ;
} ;
typedef struct TreeNodeStruct TreeNode ;
TreeNode* talloc(int data)
{
/* variables */
TreeNode *p ;
/* logic */
p = malloc(sizeof(struct TreeNodeStruct)) ;
p->data = data ;
/* return */
return p ;
}
TreeNode* addnode(TreeNode* root ,int data)
{
/* logic */
if(root == NULL) return talloc(data) ; // allocate node and return as new root
else if(data < root->data) root->left = addnode(root->left, data) ;
else root->right = addnode(root->right, data) ;
/* return */
return root ;
}
在一个非常简单的测试用例中
printf("\nProblem 5.2\n") ;
tree = talloc(0) ;
printf("talloc(0): %s\n", tree == NULL ? "failure" : "success") ;
for(int i1 = 0, i2 = 10; ++i1 < i2 ; ) addnode(tree, i1) ;
我运行变成了segmentation fault 11错误。这是我的测试用例的人工制品还是我的实现中的错误?如果是,我做错了什么?
您没有在 talloc()
中将 left
和 right
初始化为 NULL
。 addnode()
无法正确识别不存在的子树。
您应该注意 malloc()
不会在分配的内存 space 中初始化任何内容。要自动将其初始化为 0
,您应该使用 calloc()
.
p = calloc(1, sizeof(TreeNode));
在talloc
中需要将left和right设置为NULL。
当你的代码遍历二叉树时,它会不断递归调用自己,直到找到NULL,这表明你在"leaf"上。但是因为 left 和 right 包含垃圾,它不会找到 NULL。
malloc
不初始化 struct
的成员。添加代码来执行此操作。
p = malloc(sizeof(struct TreeNodeStruct)) ;
p->data = data ;
p->left = NULL;
p->right = NULL;
如果您不想使用这些行,也可以使用 calloc
。
p = calloc(1, sizeof(struct TreeNodeStruct)) ;
p->data = data ;
我是 C 的新手,我自己通过麻省理工学院开放课件进行实用的 C 编程 (MIT OCW Homepage),以便学习一些 C 基础知识。
在作业 5 中,我们应该实现一个用于分配、释放、显示和遍历的小型二叉树库。
在测试以下实现时
#include <stdlib.h>
struct TreeNodeStruct {
int data ;
struct TreeNodeStruct *left, *right ;
} ;
typedef struct TreeNodeStruct TreeNode ;
TreeNode* talloc(int data)
{
/* variables */
TreeNode *p ;
/* logic */
p = malloc(sizeof(struct TreeNodeStruct)) ;
p->data = data ;
/* return */
return p ;
}
TreeNode* addnode(TreeNode* root ,int data)
{
/* logic */
if(root == NULL) return talloc(data) ; // allocate node and return as new root
else if(data < root->data) root->left = addnode(root->left, data) ;
else root->right = addnode(root->right, data) ;
/* return */
return root ;
}
在一个非常简单的测试用例中
printf("\nProblem 5.2\n") ;
tree = talloc(0) ;
printf("talloc(0): %s\n", tree == NULL ? "failure" : "success") ;
for(int i1 = 0, i2 = 10; ++i1 < i2 ; ) addnode(tree, i1) ;
我运行变成了segmentation fault 11错误。这是我的测试用例的人工制品还是我的实现中的错误?如果是,我做错了什么?
您没有在 talloc()
中将 left
和 right
初始化为 NULL
。 addnode()
无法正确识别不存在的子树。
您应该注意 malloc()
不会在分配的内存 space 中初始化任何内容。要自动将其初始化为 0
,您应该使用 calloc()
.
p = calloc(1, sizeof(TreeNode));
在talloc
中需要将left和right设置为NULL。
当你的代码遍历二叉树时,它会不断递归调用自己,直到找到NULL,这表明你在"leaf"上。但是因为 left 和 right 包含垃圾,它不会找到 NULL。
malloc
不初始化 struct
的成员。添加代码来执行此操作。
p = malloc(sizeof(struct TreeNodeStruct)) ;
p->data = data ;
p->left = NULL;
p->right = NULL;
如果您不想使用这些行,也可以使用 calloc
。
p = calloc(1, sizeof(struct TreeNodeStruct)) ;
p->data = data ;