读书人

链表打印 循环出现 segmentation fa

发布时间: 2013-11-04 16:56:03 作者: rapoo

链表打印 ,循环出现 segmentation fault ,急急急


/*下面两个是我定义的结构*/
struct element
{
int n; /*le n de base B*/
int c; /*le c de GE*/
struct element *g_next;
};


struct GrandEntier
{
int B; /*Base de GE*/
int L; /*length de GE*/
int signe;
struct element *premier;
};

typedef struct element element;
typedef struct GrandEntier GE;


/*打印函数,逐个显示ge x的值*/
void affiche10(GE *X)
{
element *a;
a=X->premier;
if(a)
{
printf("\nAffiche en base 10 le GE X sur stdout.\n");
for(;a;a=a->g_next)
{
printf("%c%d*%d^%d",(X->signe>0)? '+':'-',a->c,X->B,a->n);
}
}
}

void main()
{
int a,b;
GE *X,*Y,*Z;
printf("insere deux entier:");
scanf("%d%d",&a,&b);
printf("%d,%d\n",a,b);
X=int2GE(a);
Y=int2GE(b);
affiche10(X);
affiche10(Y);
}


当程序调用到affiche10(X); 执行没有错误,正常打印。
当程序运行到affiche10(Y); 打印到 Affiche en base 10 le GE X sur stdout. 接着就报 segmentation fault. 我用while 取代过 for 也还是错。第一次调用affiche()没错,第二次调用时就说segmentation fault。 高手帮忙,该怎么打印元素值呢?




segmentation?fault 循环 打印函数 链表
[解决办法]
可能 Y=int2GE(b); 没有初始化好
[解决办法]
X=int2GE(a); Y=int2GE(b);确认下函数调用是否成功!
Y分配地址是否成功!

[解决办法]
segmentation fault 非法读写内存,多由指针未初始化和数组越界导致
[解决办法]
当输入为0时,因函数int2GE返回NULL,在执行affiche10时有异常。
当输入不为0时,没有发现异常。
LZ在输入什么数据时遇到segmentation fault?

以下是我在VS2010运行的lz代码:
#include <stdio.h>
/*下面两个是我定义的结构*/
struct element
{
int n; /*le n de base B*/
int c; /*le c de GE*/
struct element *g_next;
};

struct GrandEntier
{
int B; /*Base de GE*/
int L; /*length de GE*/
int signe;
struct element *premier;
};

typedef struct element element;
typedef struct GrandEntier GE;



GE *Init_GE()
{
GE *ge;
ge=(GE*)malloc(sizeof(GE));
ge->B=10;
ge->L=0;
ge->signe=1;
ge->premier=NULL;
return ge;
}


GE *int2GE(int n)
{
GE *ge;
element *p,*q;
/*删
if(n==0)
{
return NULL;
}*/
ge=Init_GE();
//ge->signe=(n>0)? 1:-1; 改为以下语句以免输出两个负号
if (n >0 ) ge->signe = 1;
else
{
ge->signe = -1;
n = -n;
}

while(n!=0)
{
if(ge->L==0)
{
q=(element*)malloc(sizeof(element));
q->c=n%ge->B;
q->n=ge->L;
q->g_next=NULL;
ge->premier=q;
ge->L++;
n=n/ge->B;

}
else
{
p=(element*)malloc(sizeof(element));
p->c=n%ge->B;
p->n=ge->L;
p->g_next=NULL;
q->g_next=p;
q=p;

n=n/ge->B;
ge->L++;

}

}
return ge;
}

/*打印函数,逐个显示ge x的值*/
void affiche10(GE *X)
{
element *a;
a=X->premier;
if(a)
{
printf("\nAffiche en base 10 le GE X sur stdout.\n");


for(;a;a=a->g_next)
{
printf("%c%d*%d^%d",(X->signe>0)? '+':'-',a->c,X->B,a->n);
}
}
}

void main()
{
int a,b;
GE *X,*Y,*Z;
printf("insere deux entier:");
scanf("%d%d",&a,&b);
printf("%d,%d\n",a,b);
X=int2GE(a);
Y=int2GE(b);
affiche10(X);
affiche10(Y);
}


[解决办法]
以上代码中对函数int2GE略有修改,以避免输入为0时出现异常和输入为负数时输出2个负号。
[解决办法]
检查越界问题,或者初始化失败,内存非法访问会出现段错误提示!

读书人网 >C语言

热点推荐