2013-10-19 69 views
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); 
} 
+1

您很可能寫出了您已經分配的數據的界限。使用[Valgrind](http://valgrind.org/)等工具來幫助您找到它。 –

+3

使用調試器,不要轉儲很多代碼 –

+3

'Q q; q = malloc(sizeof(Q));'typedef被認爲是有害的。 – wildplasser

回答

1

當您在sizeof(Q)中執行時,該行

q = malloc(sizeof(Q)); 

實際上您只爲指針分配大小,即sizeof(struct CircularQueue *)。這隻有4或8個字節,取決於平臺(32或64位)。

根據32位或64位平臺,結構的實際大小爲21或20個字節(16個字節加上填充)。

這會導致您寫入分配的內存之外,然後您有未定義的行爲。最可能發生的情況是您覆蓋了內存分配系統所需的數據,因此稍後的調用將會造成災難性的失敗。

相關問題