我正在尝试创建一个链接列表数组,并且只遇到数组问题。代码运行正常(或者至少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;
}
答案 0 :(得分:2)
for (labels = 0; labels < 5; labels++) {
newLabel("Hi", p, labels);
}
在此循环中,您分配了*p
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);
}