链表列表中的分段错误

时间:2017-11-21 05:02:16

标签: c arrays

我正在尝试创建一个链接列表数组,并且只遇到数组问题。代码运行正常(或者至少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;
}

3 个答案:

答案 0 :(得分:2)

  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个成员

答案 1 :(得分:1)

查看您的代码

    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);
  }

解决方案是remove = from for循环,即循环语法是

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

答案 2 :(得分:0)

到这个循环结束时

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);
  }