malloc struct指针抛出分段错误(核心转储)

时间:2014-08-19 15:27:38

标签: c struct segmentation-fault malloc

我有这两个结构

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错误? 我无法找到一个可以帮助解决我的例子。

由于

2 个答案:

答案 0 :(得分:3)

看起来像是第四行的错误(也是你混合rootbottom)。试试这个:

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(如果有)。