【问题标题】:Implementation of Queue using pointers : segmentation error使用指针实现队列:分段错误
【发布时间】:2011-07-05 07:52:40
【问题描述】:

我正在尝试实现 FIFO。代码编译没有错误,但运行程序时我得到segmentation fault。有什么问题?

#include <stdio.h>    
#include <stdlib.h>    
struct cell            
{
 int element;
 struct cell *next;
};
struct queue           
{
 struct cell *front;   
 struct cell *rear;    
};

void enqueue(int x, struct queue *Q);
void dequeue(struct queue *Q);

main()  
/* Manipulation of a linked queue of cells. */
{
 struct queue *Q;
 struct cell *q;
 int i;

 Q->front=Q->rear=NULL;
 for(i=0; i<8; i++) {enqueue(i+1, Q);} 
 printf("Q->front = %p,  Q->rear = %p\n", Q->front, Q->rear);
 q=Q->front;
 while(q!=NULL)
   {
    printf("cell = %d, %p\n", q->element, q->next);
    q=q->next;
   }  
 for(i=0; i<10; i++) dequeue(Q);
 printf("Q->front = %p,  Q->rear = %p\n", Q->front, Q->rear);
 q=Q->front;
 while(q!=NULL)
   {
    printf("cell = %d, %p\n", q->element, q->next);
    q=q->next;
   } 
 return(0);
}

void enqueue(int x, struct queue *Q)

{
 struct cell *p;

 p=(struct cell *)malloc(sizeof(struct cell)); 
 if(Q->rear != NULL) Q->rear->next = p;        
 Q->rear = p;
 if(Q->front == NULL) Q->front = p;            
 Q->rear->element = x; Q->rear->next = NULL;
 return;
}

void dequeue(struct queue *Q)
{
 struct cell *q;

 if(Q->front == NULL) {printf("Error: Queue is empty.\n"); exit(1);} 

 else {q=Q->front; Q->front = Q->front->next; free(q);} 
 if(Q->front == NULL) Q->rear = NULL;
 return;
}

【问题讨论】:

  • 问题是您使用单字母变量名(有些仅按大小写区分)使代码几乎无法运行。崩溃的错误是该原始问题的第一个也是最明显的后果。
  • -1:如果你能告诉我们你在程序中的什么地方遇到了段错误,那就太好了?

标签: c pointers queue


【解决方案1】:

您没有为Q 分配内存并立即使用它:

struct queue *Q; /* Where does Q point ? */

Q->front=Q->rear=NULL; /* Q not initialized, undefined behavior */

所以 Q 指向堆栈上的某个随机值。要解决它,请使用malloc

struct queue *Q;
Q = malloc(sizeof(*Q));
if (NULL == Q) {
    /* Tinfoil hat. */
}

【讨论】:

  • Q = malloc(sizeof(*Q)); ?? :)
  • @Donotalo 是的 :-) 我总是这样做(也许我想稍后更改 Q 的类型?) + 少打字。
【解决方案2】:

你没有空间分配给你的struct queue *Q;

 struct queue *Q;
 struct cell *q;
 int i;

 Q->front=Q->rear=NULL;

Q 只是一个未初始化的指针。它没有指向任何有效的东西,所以你不能像在Q-&gt;front=Q-&gt;rear=NULL;中那样取消引用它

更改它以在堆栈上分配 Q,并将其地址传递给您的函数。

 struct queue Q;
 struct cell *q;
 int i;

 Q.front=Q.rear=NULL;
 for(i=0; i<8; i++) {enqueue(i+1, &Q);} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 2020-12-27
    相关资源
    最近更新 更多