QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 943|回复: 7

为什么会出现段错误?

[复制链接]
发表于 2004-5-20 13:19:41 | 显示全部楼层 |阅读模式
该列队链接能正确的编译运行完,但在运行完之后出现一个"段错误",为什么?

[code:1]
#include <stdio.h>

typedef struct linked_queue
{
  int data;
  struct linked_queue *next;
} LqueueTp;

typedef struct queueptr
{
  LqueueTp *front, *rear;
} QueptrTp;

int main()
{
  QueptrTp *lq;
  int input;
  int i = 0;
  int outnum;

  InitQueue(&lq);
  printf("请输入一些数字:");
  scanf("%d", &input);
  while (input != 0)
    {
      EnQueue(&lq, input);
      scanf("%d", &input);
    }
  GetHead(&lq, &input);
  printf("当前链接列队的队头为:%d", input);
  printf("\n请输入要出队的个数:");
  scanf("%d", &outnum);
  printf("依此出队的数为:");
  while (i < outnum)
    {
      OutQueue(&lq, &input);
      printf("%d ", input);
      i++;
    }
  printf("\n当前列队排列:");
  while (! EmptyQueue(&lq))
    {
      OutQueue(&lq, &input);
      printf("%d ", input);
    }
  printf("\n\n");
}

int InitQueue (QueptrTp **lq)
{
  LqueueTp *p;
  p = (LqueueTp *) malloc (sizeof(LqueueTp));
  (*lq) -> front = p;
  (*lq) -> rear = p;
  ((*lq) -> front)  -> next = NULL;
}

int EnQueue (QueptrTp **lq, int x)
{
  LqueueTp *p;
  p = (LqueueTp *) malloc (sizeof(LqueueTp));
  p -> data = x;
  p -> next = NULL;
  ((*lq) -> rear) -> next = p;
  (*lq) -> rear = p;
}

int OutQueue (QueptrTp **lq, int *x)
{
  LqueueTp *s;
  if ((*lq) -> front == (*lq) -> rear)
    {
      printf("队空!\n");
      return 0;
    }
  else
    {
    s = ((*lq) -> front) -> next;
    *x = s -> data;
    ((*lq) -> front) -> next = s -> next;
    if (s -> next == NULL)
      (*lq) -> rear = (*lq) -> front;
    free(s);
    return 1;
    }
}

int EmptyQueue (QueptrTp **lq)
{
  if (((*lq) -> rear) == ((*lq) -> front))
    return 1;
  else
    return 0;
}

int GetHead (QueptrTp **lq, int *x)
{
  LqueueTp *p;
  if ((*lq) -> rear == (*lq) -> front)
    return 0;
  else
    {
      p = ((*lq) -> front ) -> next;
      *x = p -> data;
      return 1;
    }
}

[/code:1]
发表于 2004-5-20 17:22:27 | 显示全部楼层
gdb调试呀
回复

使用道具 举报

发表于 2004-5-20 17:39:10 | 显示全部楼层
无法运行,修改了一下:
[code:1] #include <stdio.h>

typedef struct linked_queue
{
  int data;
  struct linked_queue *next;
} LqueueTp;

typedef struct queueptr
{
  LqueueTp *front, *rear;
} QueptrTp;

int main()
{
  QueptrTp *lq;
  int input;
  int i = 0;
  int outnum;

//我认为这儿要加一条,因为你只要一个指针变量lq,并没有指向一个
//QueptrTp节点,你却在InitQueue中通过取地址想要使用这个
//QueptrTp节点。
  lq=(QueptrTp*)malloc(sizeof(QueptrTp));

  InitQueue(&lq);
  printf("请输入一些数字:");
  scanf("%d", &input);
  while (input != 0)
    {
      EnQueue(&lq, input);
      scanf("%d", &input);
    }
  GetHead(&lq, &input);
  printf("当前链接列队的队头为:%d", input);
  printf("\n请输入要出队的个数:");
  scanf("%d", &outnum);
  printf("依此出队的数为:");
  while (i < outnum)
    {
      OutQueue(&lq, &input);
      printf("%d ", input);
      i++;
    }
  printf("\n当前列队排列:");
  while (! EmptyQueue(&lq))
    {
      OutQueue(&lq, &input);
      printf("%d ", input);
    }
  printf("\n\n");
  free(lq);
}

int InitQueue (QueptrTp **lq)
{
  LqueueTp *p;
  p = (LqueueTp *) malloc (sizeof(LqueueTp));
  (*lq) -> front = p;
  (*lq) -> rear = p;
  ((*lq) -> front)  -> next = NULL;
}

int EnQueue (QueptrTp **lq, int x)
{
  LqueueTp *p;
  p = (LqueueTp *) malloc (sizeof(LqueueTp));
  p -> data = x;
  p -> next = NULL;
  ((*lq) -> rear) -> next = p;
  (*lq) -> rear = p;
}

int OutQueue (QueptrTp **lq, int *x)
{
  LqueueTp *s;
  if ((*lq) -> front == (*lq) -> rear)
    {
      printf("队空!\n");
      return 0;
    }
  else
    {
    s = ((*lq) -> front) -> next;
    *x = s -> data;
    ((*lq) -> front) -> next = s -> next;
    if (s -> next == NULL)
      (*lq) -> rear = (*lq) -> front;
    free(s);
    return 1;
    }
}

int EmptyQueue (QueptrTp **lq)
{
  if (((*lq) -> rear) == ((*lq) -> front))
    return 1;
  else
    return 0;
}

int GetHead (QueptrTp **lq, int *x)
{
  LqueueTp *p;
  if ((*lq) -> rear == (*lq) -> front)
    return 0;
  else
    {
      p = ((*lq) -> front ) -> next;
      *x = p -> data;
      return 1;
    }

} [/code:1]

另,加上-Wall参数有许多不合理的地方。
回复

使用道具 举报

发表于 2004-5-22 02:23:58 | 显示全部楼层
段错误的常见原因有两种,一是没有正确地使用指针(严重时还会导致挂机),二是编译好的二进制执行文件放到不同的环境中执行(如动态链接库的版本与宿主机不一致)。在此应是前者,好好检查一下。
回复

使用道具 举报

发表于 2004-5-22 02:26:37 | 显示全部楼层
lluct, 你是民院的么?咱是不是见过面?
回复

使用道具 举报

发表于 2004-5-22 22:55:34 | 显示全部楼层
哪个民院?我也是某个民院的哦!
回复

使用道具 举报

发表于 2004-5-22 23:22:46 | 显示全部楼层
广西。版主您不会也是少数民族罢?
回复

使用道具 举报

发表于 2004-5-23 15:53:29 | 显示全部楼层
可能使指针的使用出问题了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-8 06:52 , Processed in 0.126203 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表