Вопрос

Я разрабатываю структуру массива только для развлечения. Эта структура, обобщенная параметром шаблона, предварительно выделяет данное количество элементов при запуске, затем, если «занятые» элементы более чем доступны, функция Realloc Realoc Verive Buffer. Код тестирования:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

template <typename T> struct darray_t {
    size_t items;
    size_t busy;
    T     *data;
};

#define DARRAY_REALLOC_ITEMS_STEP 10

#define da_size(da) (da)->busy

template <typename T>
void da_init( darray_t<T> *da, size_t prealloc ){
    da->items = prealloc;
    da->busy  = 0;
    da->data  = (T *)malloc( sizeof(T) * prealloc );
}

template <typename T> T *da_next( darray_t<T> *da ){
    if( da->busy >= da->items ){
        da->data   = (T *)realloc( da->data, sizeof(T) * DARRAY_REALLOC_ITEMS_STEP );
        da->items += DARRAY_REALLOC_ITEMS_STEP;
    }
    return &da->data[ da->busy++ ];
}

int main(){
    darray_t<int> vi;
    int *n;

    da_init( &vi, 100 );

    for( int i = 0; i < 101; ++i ){
        n = da_next(&vi);
        *n = i;
    }

    for( int i = 0; i < da_size(&vi); ++i ){
        if( vi.data[i] != i ){
            printf( "!!! %d != %d\n", i, vi.data[i] );
        }
    }

    return 0;
}

Как видите, я Presalloc 100 целочисленных указателей в начале, а затем realoc их на 10 указателей на время. В главной функции я выполняю цикл для проверки целостности элементов и, если элемент массива не так, как я ожидаю, я печатаю его значение и ... Вы знаете, что? У меня есть следующее сообщение:

!!! 11 != 135121

На самом деле, товар по индексу 11, что должно быть «11», 135121 !!!! : S.

Можете ли вы сказать мне, если мой код не правильный?

Спасибо

ПРИМЕЧАНИЕ Я прекрасно знаю, что смешивание C и C ++ таким образом уродливый, И я тоже знаю, что эта структура привела бы, если используется, например:

darray_t<std::string>

Это просто тест для указателей INT.

Это было полезно?

Решение

Realloc не автоматически не выращивает кусок памяти - вам придется это сделать. Сделать, например:

da->data=(T*)realloc(da->data, sizeof(T)*(da->items+DARRAY_REALLOC_ITEMS_STEP));

(И вы должны обрабатывать Realloc возвращать NULL)

Другие советы

Размер блока неверный:

da->data   = (T *)realloc( da->data, sizeof(T) * DARRAY_REALLOC_ITEMS_STEP );

Весь блок такой же большой, как приращение. Пытаться

da->busy + sizeof(T) * DARRAY_REALLOC_ITEMS_STEP
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top