首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

链表打印 ,循环出现 segmentation fault ,解决方案

2013-11-04 
链表打印 ,循环出现 segmentation fault ,急急急/*下面两个是我定义的结构*/struct element{int n /*le n

链表打印 ,循环出现 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个负号。
[解决办法]
检查越界问题,或者初始化失败,内存非法访问会出现段错误提示!

热点排行