【问题标题】:C malloc segmentation fault structC malloc 分段错误结构
【发布时间】:2019-12-17 19:11:44
【问题描述】:

在我老师提供给我们的教科书中,有这个 C 代码的示例,当我尝试运行时会出现 Segmentation Fault 错误:

const celula *nulo = NULL;
typedef char informacao;
typedef celula *noh;
typedef celula *arvore;
struct celula {informacao info; noh pai; noh fesq; noh idir;};

...

typedef struct celfloresta celfloresta;
typedef struct celfloresta *floresta;
typedef struct celfloresta *posicfloresta;
struct celfloresta {arvore elem; celfloresta *prox;};

...

void FormarListaNohs(){
    floresta p = (floresta)malloc(sizeof(celfloresta));
    p->elem->info = '3';
}

...

为什么行 p->elem->info = '3'; 这里给出分段错误?

【问题讨论】:

  • malloc 也需要内存供 elem 使用。
  • 关于:const celula *nulo = NULL; 这是在定义之前使用celula。建议将该语句移到结构定义之后
  • OT:关于:floresta p = (floresta)malloc(sizeof(celfloresta)); 1) 在 C 中,返回的类型是 void*,可以分配给任何指针。强制转换只会使代码混乱。建议去掉演员表。 2) 始终检查 (!=NULL) 返回值以确保操作成功。
  • OT: about: typedef struct celfloresta *floresta; and typedef struct celfloresta *posicfloresta; and typedef celula *noh;` and typedef celula *arvore;隐藏typedef中的指针。

标签: c pointers struct segmentation-fault malloc


【解决方案1】:

elem 是一个指针。你需要为它分配内存:

p->elem = malloc(sizeof(arvore));

【讨论】:

    【解决方案2】:

    基本上 malloc 返回一个 void 指针然后进行强制转换应该使用指针类型的变量 一个例子:

    int *p = malloc(sizeof(int))
    struct s_list *l = malloc(sizeof(struct s_list))
    

    然后你可以取消引用指针,例如

    l->data = 12;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      • 2014-08-12
      • 1970-01-01
      • 2017-10-03
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      相关资源
      最近更新 更多