【问题标题】:Segmentation fault in array of linked lists链表数组中的分段错误
【发布时间】:2017-11-21 05:02:15
【问题描述】:

我正在尝试创建一个链表数组,但只遇到了数组问题。代码运行良好(或者至少 printf 在函数中运行)但是当我尝试在 main 中循环打印时,我得到了一个分段错误,并且这些行没有在 newLabel 函数中打印。

void newLabel(char *n, Label **p, int len) {
  p[len] = malloc(sizeof(Label));
  p[len]->next = NULL;
  p[len]->name = malloc(sizeof(char) * strlen(n)+1);
  strcpy(p[len]->name, n);
  printf("%s", p[len]->name);
  ++labels;
}

int main(int argc, char const *argv[]) {
  Label *p[100];
  for (labels = 0; labels < 5; labels++) {
    newLabel("Hi", p, labels);
  }

  for (int i = 0; i <= labels; i++) {
    printf("%s", p[labels]->name);
  }
  return 0;
}

【问题讨论】:

  • 在调试器中运行即可
  • 我猜是因为字符串进入了标签的名称字段,并且函数特定于标签。但我想你是对的。

标签: c arrays


【解决方案1】:
  for (labels = 0; labels < 5; labels++) {
    newLabel("Hi", p, labels);
  }

在这个循环中,您分配了*p 的前 5 个元素

  for (int i = 0; i <= labels; i++) {
    printf("%s", p[labels]->name);
  }

在下一个循环中,您正在访问尚未分配的第 6 个成员

【讨论】:

  • 这只是将其移出主程序的错误。修复它时它仍然不起作用。我将其移出是因为将打印循环放入某人会破坏 newLabel 函数。它不会像注释掉 for 循环时那样打印所有名称。
  • 标签是全球性的吗?如果是,它被递增两次,只需 make 是 main() 的本地并运行与第一个循环相同的打印循环,例如 for (int i = 0; i 名称); }
  • 是的,这是个问题。与原版相同,只是功能不同。谢谢
【解决方案2】:

查看您的代码

    for (int i = 0; i <= labels; i++) { //problem here 
    printf("%s", p[labels]->name);
  }

您正在执行一个从 0 开始到标签 (5) 的循环。这意味着它运行标签值 0,1,2,3,4,5 即 6 次,而您在下面的代码中仅为 5 个元素分配内存

for (labels = 0; labels < 5; labels++) {
    newLabel("Hi", p, labels);
  }

解决方案是从 for 循环中删除 =,即 for 循环语法是

for (int i = 0; i < labels; i++)

【讨论】:

    【解决方案3】:

    到这里循环结束

    for (labels = 0; labels < 5; labels++) {
        newLabel("Hi", p, labels);
      }
    

    labels 是 5,从未初始化,但在下面的循环中,您仍在尝试打印 p[5]

      for (int i = 0; i <= labels; i++) {
        printf("%s", p[labels]->name); // this labels can be 5 here
      }
    

    所以在边界内循环

    for (int i = 0; i < labels; i++) {
        printf("%s", p[labels]->name);
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-09
      • 2020-06-19
      • 1970-01-01
      • 2018-02-18
      • 1970-01-01
      相关资源
      最近更新 更多