我有这两个结构
struct node{
int val;
struct node *up;
struct node *down;
};
struct stack {
struct node *bottom;
};
typedef结构在头文件
中定义typedef struct stack stack_set;
我正在尝试malloc
结构但我在尝试访问node
结构时遇到了seg错误。我尝试在malloc
结构上使用node
无效。
stack_set *set;
set = malloc(sizeof(stack_set));
set->bottom = NULL;
set = malloc(sizeof(struct node));
set->bottom->val = NULL;
return set;
我在第二行代码中遇到了一个seg错误。
我如何正确malloc
我的代码,所以我不会继续抛出seg错误?
我无法找到一个可以帮助解决我的例子。
由于
答案 0 :(得分:3)
看起来像是第四行的错误(也是你混合root
和bottom
)。试试这个:
stack_set *set;
set = malloc(sizeof(stack_set));
set->bottom = malloc(sizeof(struct node));
set->bottom->val = 0; // it is better to initialize
set->bottom->up = NULL; // all fields to avoid undefined
set->bottom->down = NULL; // behaviour in the future
return set;
最好检查内存分配函数的结果:
stack_set *set;
set = malloc(sizeof(stack_set));
if (!set)
return NULL;
set->bottom = malloc(sizeof(struct node));
if (!set->bottom) {
free(set);
return NULL;
}
set->bottom->val = 0;
set->bottom->up = NULL;
set->bottom->down = NULL;
return set;
答案 1 :(得分:2)
标准malloc(3)功能。正在返回未初始化的内存。你需要初始化它。所以
之后 set = malloc(sizeof(struct node));
您的所有set
字段都包含垃圾值(或malloc
失败并提供NULL
)。特别是你不应该取消引用set->root
,这是undefined behavior,如果运气不好可能会有效。
我建议使用calloc
来获取归零内存:
set = calloc(1, sizeof(struct stack));
if (!set) {perror("calloc stack"); exit(EXIT_FAILURE); };
set->bottom = calloc(1, sizeof(struct node));
if (!set->bottom) {perror("calloc node"); exit(EXIT_FAILURE); };
如果您无法使用calloc
使用memset
清除内存。
编译所有警告和调试信息(gcc -Wall -g
)并使用valgrind(如果有)。