glibc检测到realloc():下一个大小无效

时间:2013-10-19 08:00:34

标签: c realloc

#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);
}

1 个答案:

答案 0 :(得分:1)

当您执行sizeof(Q)时这条线

q = malloc(sizeof(Q));

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

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

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