0
#include<stdio.h>
#include<stdlib.h>
#define SIZE 5

struct CircularQueue{
  int front,rear;
  int capacity;
  int *data;
};

typedef struct CircularQueue * Q;

// create  queue
Q createQueue(int size)
{
  Q q;
  q = malloc(sizeof(Q));
  if(!q)
    return NULL;
  q->front=q->rear=-1;
  q->capacity=size;
  q->data=malloc(sizeof(int)*q->capacity);  
  if(!q->data)
    return NULL;
  printf("Queue created successfully...\n");
  return q;
}

// Resize Queue (Here it is showing error in realloc )    
void resize(Q q)
{
  int size = q->capacity;
  q->capacity *=2;  

   // *****Error 
  q->data = realloc(q->data,sizeof(int)*q->capacity);
  // *****

  if(!q->data)
  {
    printf("memory error ...\n");
    return ;
  }
  if(q->front>q->rear)
  {
    int i;
    for(i=0;i<q->front;i++)
      q->data[i+size]=q->data[i];
    q->rear = q->rear+size;  
  }

} 

// Insert in Queue

void Enqueue(Q q,int data)
{
  if(IsQueueFull(q))
    resize(q);
  if(q->front==-1)
     q->front = q->rear=0;
  else
     q->rear = (q->rear+1)  % q->capacity;  
  q->data[q->rear]=data; 
}

int IsQueueFull(Q q)
{
  return (q->rear+1)%q->capacity==q->front;
}

int IsQueueEmpty(Q q)
{
  return q->front==-1;
}

// Delete from queue

int Dequeue(Q q)
{
  if(IsQueueEmpty(q)){
    printf("Queue is empty..\n");
    return -1;
  }
  int data = q->data[q->front];
  if(q->front==q->rear)
    q->front=q->rear=-1;
  else  
    q->front = (q->front+1)%q->capacity;
  return data;
}

void display(Q q)
{
  int i;
  printf("Queue Elements :\n");
  while(!IsQueueEmpty(q))
  {
    printf("%d ",Dequeue(q));
  }
  printf("\n");
}

void main()
{
  int data;
  Q q;
  q = createQueue(SIZE);
  printf("Data : %d\n",Dequeue(q));
  Enqueue(q,10);
  Enqueue(q,20);  
  Enqueue(q,30);
  Enqueue(q,99);
  printf("Data : %d\n",Dequeue(q));
  printf("Data : %d\n",Dequeue(q));    
  Enqueue(q,2);
  Enqueue(q,9);
  Enqueue(q,19);
  Enqueue(q,29);
  display(q);
}
4

1 回答 1

1

当你sizeof(Q)在例如这条线

q = malloc(sizeof(Q));

您实际上只为指针分配大小,即sizeof(struct CircularQueue *). 根据平台(32 位或 64 位),这只有 4 个或 8 个字节。

结构的实际大小为 21 或 20 字节(16 字节加上填充),具体取决于 32 位或 64 位平台。

这会导致您超出分配的内存进行写入,然后您就会出现未定义的行为。最有可能发生的情况是您覆盖了内存分配系统所需的数据,因此realloc稍后的调用将失败,相当灾难性。

于 2013-10-19T11:23:10.570 回答