1

キューを実装するために C で動的配列を作成しようとしていますが、コンパイルすると次のエラーが発生します: * glibc が検出されました. / 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);
}

なぜこのエラーが発生するのですか?

4

1 に答える 1

2

ここでは常に同じサイズのメモリを割り当てます。

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
  }
}
于 2013-06-08T03:19:13.303 に答える