【问题标题】:malloc struct pointer throwing segmentation fault (core dumped)malloc 结构指针引发分段错误(核心转储)
【发布时间】:2014-08-19 15:27:37
【问题描述】:

我有这两个结构

struct node{
    int val;
    struct node *up;
    struct node *down;
};

struct stack {
    struct node *bottom;
};

typedef 结构体在头文件中定义

typedef struct stack stack_set;

我正在尝试malloc 结构,但是当我尝试访问node 结构时,我不断收到段错误。我尝试在 node 结构上使用 malloc 无济于事。

    stack_set *set;
    set = malloc(sizeof(stack_set));
    set->bottom = NULL;
    set = malloc(sizeof(struct node));
    set->bottom->val = NULL;
    return set;

我在代码的倒数第二行遇到了段错误。

我如何正确地 malloc 我的代码,这样我就不会一直抛出 seg 错误? 我找不到可以帮助解决我的问题的示例。

谢谢

【问题讨论】:

    标签: c struct segmentation-fault malloc


    【解决方案1】:

    它看起来像第四行的错误(你也混合了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;
    

    【讨论】:

    • 哇,谢谢,它现在可以工作了:D 我肯定也会使用这种彻底的检查方法。干杯!
    【解决方案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(如果可用)。

    【讨论】:

    • 感谢您的回答和使用 calloc 的提示。我也会尝试使用 valgrind。
    猜你喜欢
    • 2020-04-06
    • 2016-09-07
    • 2021-05-04
    • 2015-05-12
    • 2018-01-05
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2018-10-13
    相关资源
    最近更新 更多