您好我的代码有问题它显示此错误:“分段错误:11”这里是我的代码我正在尝试制作一个程序,使用C中的列表将二进制链表转换为十进制
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct cellule{
int b;
struct cellule* Next;
}Cellule;
typedef Cellule* liste;
int BinToEntier(liste a){
int n;
int j=0;
liste p=NULL;
for (p=a; p->Next!=NULL; p=p->Next) {
n+=(p->b)*pow(2,j);
j++;
}
return n;
}
int main() {
liste a=NULL;
liste p;
a= (liste) malloc(sizeof(Cellule));
p=a;
for (int i = 0; i < 4; i++) {
puts("enter b");
scanf("%i", &(p->b));
p=p->Next;
}
printf("%i\n", BinToEntier(a));
return 0;
}
答案 0 :(得分:2)
在:
a= (liste) malloc(sizeof(Cellule));
a
未初始化为零,但在您的循环中,您执行了p=a;...p=p->Next
。这将访问未定义的内存,可能导致seg错误。 (注意scanf("%i", &(p->b));
也可能导致seg错误。)
同样在BinToEntier
中,您忘记初始化n
。
答案 1 :(得分:2)
函数main()中的for循环导致分段错误。简单地说,您不是为列表的每个节点(即Cellule)分配空间,而是仅分配第一个元素。此外,但几乎同样重要的是,您附加到列表尾部的最后一个节点的分配是错误的。
考虑切换到下面给出的用法。
int main() {
liste p=NULL;
liste *tp = &p;
for (int i = 0; i < 4; i++) {
*tp = malloc(sizeof(Cellule));
puts("enter b");
scanf("%i", &((*tp)->b));
*tp=&((*tp)->Next);
}
*tp = NULL;
printf("%i\n", BinToEntier(p));
return 0;
}
上面给出的代码使用变量tp,它是指向Cellule的指针。 (即列表节点)实际上,我们更新tp以显示列表中最后一个Cellule的“Next”属性,并在我们向列表p添加新节点时更新它。