【问题标题】:realloc(): invalid next size in my code [duplicate]realloc():我的代码中的下一个大小无效[重复]
【发布时间】:2025-11-24 04:10:01
【问题描述】:

我试图在 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);
}

为什么会出现这个错误?

【问题讨论】:

  • 您的代码有一个错误 - 如果 realloc() 失败,它会返回一个 NULL 指针,这将覆盖您的 queue-&gt;array 变量并且原始内存块会泄漏(因为您将无法释放它了)。

标签: c arrays dynamic glibc realloc


【解决方案1】:

你总是在这里分配相同大小的内存:

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
  }
}

【讨论】:

  • 您的代码与原始代码有相同的错误。你需要先把realloc()返回的指针放在一个临时变量中,因为如果它为NULL,原来的会被覆盖。
  • 我不确定 OP 是否意识到他的“memory_allocated”实际上不是字节大小;这个名字并不暗示它。
  • @xxbbcc 确实如此。尽管答案确实正确解决了程序在运行时失败的原因。
  • @NikosC。是的,我没有对其余的答案说什么。然而,忘记检查内存分配的返回值是一个常见的错误。因此,我看到了许多严重的错误。
  • 谢谢,终于解决了我的问题
最近更新 更多