【问题标题】:Segmentation Fault from accessing a struct访问结构的分段错误
【发布时间】:2020-02-06 02:33:43
【问题描述】:

由于此代码,我遇到了分段错误(核心转储)错误:

char **getPipedCmds(Pgm *p){

  if (p == NULL) {
  } else {
    char **pipedP = p->next->pgmlist; // I'm the line where the seg fault occurs.
    return pipedP;
  }
}

这里是结构定义,在这里可能非常有用......

typedef struct c {
  char **pgmlist;
  struct c *next;
} Pgm;

typedef struct node { 
  Pgm  *pgm;
  ...
} Command;

那么,有没有办法从p->next->pgmlist 获取我需要的数据而不会出现段错误?

【问题讨论】:

  • 好吧 p->next 为空或指向任何地方
  • 你已经确定了p != NULL,但是p->next != NULL呢?在取消引用之前,您应该始终知道指针是否为 NULL
  • 并非所有控制路径都返回值。

标签: c shell syntax segmentation-fault


【解决方案1】:

这是一个常见错误,您应该真正尝试使用调试工具来学习。

据我所知,您在访问 p->next 之前不会检查它是否存在。如果它为 NULL,那将是未定义的行为,并且您会遇到分段错误。如果它是一个随机值,你应该在分配内存时适当地初始化你的结构,在这种情况下,next 为 NULL。

添加这几行应该是安全的。

if (p != NULL) {

    if (p->next != NULL) {
        char **pipedP = p->next->pgmlist; // I'm the line where the seg fault occurs.
        return pipedP;
    }

}

一些小技巧,

  1. 为结构分配内存时,将其设置为 0(即memset(mem, 0, sizeof mem)
  2. 访问指针时,请始终检查其是否为 NULL,否则会产生像这里这样的分段错误
  3. 当您的程序被杀死时,您可以使用coredumpctl gdb 回溯系统杀死它的原因(它将获取您计算机上生成的最后一个转储并将其放在 gdb 上进行调试)

【讨论】:

    猜你喜欢
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多