#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);
}
答案 0 :(得分:1)
当您执行sizeof(Q)
时这条线
q = malloc(sizeof(Q));
实际上,您只为指针分配大小,即sizeof(struct CircularQueue *)
。这只有4或8个字节,具体取决于平台(32位或64位)。
结构的实际大小为21或20字节(16字节加填充),具体取决于32位或64位平台。
这会导致您编写超出分配的内存,然后您有未定义的行为。最可能发生的是你覆盖了内存分配系统所需的数据,因此稍后realloc
调用将会发生灾难性的失败。