realloc():代码中的下一个大小无效

realloc():代码中的下一个大小无效,c,arrays,dynamic,glibc,realloc,C,Arrays,Dynamic,Glibc,Realloc,我试图在C中创建一个动态数组来实现队列,编译时出现以下错误:*glibc-detected/Ex:realloc():下一个大小无效:0x0000000001fbe030** 我的代码如下: typedef uint32_t u32; typedef uint64_t u64; typedef struct _queue_t *queue_t; struct _queue_t { u32 *array; // Arreglo para guardar elementos de la

我试图在C中创建一个动态数组来实现队列,编译时出现以下错误:*glibc-detected/Ex:realloc():下一个大小无效:0x0000000001fbe030**

我的代码如下:

typedef uint32_t u32;
typedef uint64_t u64;


typedef struct _queue_t *queue_t;

struct _queue_t {
    u32 *array; // Arreglo para guardar elementos de la cola
    u32 FirstElem; // Primer elemento de la cola
    u32 LastElem; // Ultimo elemento de la cola
    u32 memory_allocated; // Para saber si tengo que pedir mas memoria
    u32 Size; // Devuelve la cantidad actual de elementos que tiene la cola
};

queue_t queue_empty() {
    queue_t queue = NULL;
    queue = calloc (1, sizeof (struct _queue_t));

    assert(queue != NULL);

    queue->array = (u32 *) calloc(100, sizeof(u32));
    queue->FirstElem = 0;
    queue->LastElem = 0;
    queue->memory_allocated = 100;
    queue->Size = 0;

    return queue;
}

int main() {

    queue_t queue = NULL;
    queue = queue_empty();

    for (u32 i = 0; i < 1000; i++) {

        if (queue->memory_allocated == queue->Size) {
            queue->array = (u32 *) realloc (queue->array, 100*sizeof(u32));
            queue->memory_allocated += 100;
        }

        queue->LastElem += 1;
        queue->array[queue->LastElem] = i;
        queue->Size += 1;
    }

    return(0);
}
typedef uint32\u t u32;
类型定义uint64_t u64;
typedef struct_queue_t*queue_t;
结构队列{
u32*数组;//Arreglo para guardar elementos de la cola
u32 FirstElem;//可乐底漆
u32 LastElem;//Ultimo elemento de la cola
u32内存分配;//内存分配
u32尺寸;//Devuelve la cantidad actual de elementos que tiene la cola
};
queue_t queue_empty(){
queue\u t queue=NULL;
queue=calloc(1,sizeof(struct_queue_t));
断言(队列!=NULL);
队列->数组=(u32*)calloc(100,sizeof(u32));
队列->第一元素=0;
队列->LastElem=0;
队列->内存分配=100;
队列->大小=0;
返回队列;
}
int main(){
queue\u t queue=NULL;
queue=queue_empty();
对于(u32 i=0;i<1000;i++){
如果(队列->内存分配==队列->大小){
队列->数组=(u32*)realloc(队列->数组,100*sizeof(u32));
队列->内存分配+=100;
}
队列->LastElem+=1;
队列->数组[queue->LastElem]=i;
队列->大小+=1;
}
返回(0);
}

为什么会发生此错误?

您总是在此处分配相同大小的内存:

if (queue->memory_allocated == queue->Size) {
  queue->array = (u32 *) realloc(
      queue->array, 100*sizeof(u32)); // always 100 * sizeof(u32)
  queue->memory_allocated += 100;
}
我想你要做的是再分配100个元素。您还应该通过引入一个临时变量来检查realloc()的返回值,因为可能会返回
NULL
,从而丢失指向当前分配内存的唯一指针:

if (queue->memory_allocated == queue->Size) {
  int new_size = queue->memory_allocated + 100; // increment first
  u32* new_array = (u32 *) realloc(queue->array, new_size * sizeof(u32));
  if (new_array) { // update only if realloc() returns a valid address.
    queue->memory_allocated = new_size;
    queue->array = new_array;
  } else {
    // do something in react
  }
}

您的代码有一个bug-如果
realloc()
失败,它将返回一个空指针,这将覆盖
queue->array
变量,原始内存块将泄漏(因为您将无法再释放它)。您的代码与原始代码有相同的bug。您需要首先将
realloc()
返回的指针放入一个临时变量中,因为如果它为NULL,原始指针将被覆盖;名称并不意味着它。@xxbbcc确实如此。尽管答案正确地说明了程序在运行时失败的原因。@NikosC。是的,我没有说关于剩下的答案。然而,忘记检查内存分配的返回值是一个常见的错误。因为这个,我看到了很多严重的错误。谢谢,终于解决了我的问题