gpt4 book ai didi

c - glibc 检测到 realloc() : invalid next size

转载 作者:行者123 更新时间:2023-11-30 15:44:29 25 4
gpt4 key购买 nike

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

最佳答案

当您在例如中执行 sizeof(Q) 时线

q = malloc(sizeof(Q));

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

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

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

关于c - glibc 检测到 realloc() : invalid next size,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19463849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com