c - 重新分配(): invalid next size in my code

标签 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 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);
}

为什么会出现这个错误?

最佳答案

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

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

关于c - 重新分配(): invalid next size in my code,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16995653/

相关文章:

c - C语言中的sd spi模式

c - 如何在 makefile 中定义宏以启用 C 头文件中的功能?

C传递指针数组

c - 初学者从结构数组中删除第一个元素 (C)

Java 从包含空格的字节数组创建字符串

CSS 样式 #elements[1-10]

PHP Copy 从远程服务器动态创建的 TIFF 图像

c++ - 使用数组的文件输出不正确

android - 动态改变Android中按钮的宽度

java - 配置 Hibernate 以使用数据库,其名称在运行前未知