Вопрос

У меня проблема с функцией realloc в C.Я передаю вам код ниже:

typedef struct _Pool Pool;
typedef struct _Item Item;

struct _Pool {
    Item ** items;
    unsigned int itemsCount;
    unsigned int poolSize;
    unsigned int poolStep;
};

struct _Item {
    char * file; 
    unsigned int lenOfFilePath;
    unsigned int x;
};

void Pool_insert(Pool ** pool, Item * item)
{       
    if ((*pool)->itemsCount + 1 == (*pool)->poolSize)
    {
        (*pool)->items = realloc((*pool)->items, sizeof(Item *)*((*pool)->poolSize + (*pool)->poolStep));;
        if (!(*pool)->items) return;
        (*pool)->poolSize += (*pool)->poolStep;
    }

    (*pool)->items[(*pool)->itemsCount++] = item;
}

Я не отправляю первый код распределения, но если я увеличу количество элементов, которые я там использую, все будет работать нормально.Когда я вызываю realloc, я получаю такую ​​ошибку:

маллок:*** ошибка для объекта 0x19dba8:указатель перераспределен не был выделен

Не могли бы вы помочь мне решить мою проблему?


Вот метод создания пула:

void Pool_create(Pool ** pool, unsigned int poolSize)
{   
    unsigned int poolMemSize = sizeof(Pool) + sizeof(Item *)*poolSize;
    *pool = malloc(poolMemSize);
    if (!*pool) return;
    memset(*pool,0,poolMemSize);

    (*pool)->itemsCount = 0;
    (*pool)->poolSize = poolSize;
    (*pool)->poolStep = POOL_STEP;

    (*pool)->items = (Item **)((char*)(*pool) + sizeof(Pool));
    if(!(*pool)->items) return;
    memset((*pool)->items, 0, sizeof(Item *) * poolSize);
}

Как я уже сказал, если я хочу, например, вставить 1000 элементов и выделить память с помощью функции создания, тогда все будет работать нормально, если я объявлю стартовый размер пула для 100 элементов, а затем захочу перераспределить элементы, я получу ошибку.

Большое спасибо за такой быстрый ответ.

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

Решение

Но (*pool)->items никогда не выделялся!Вы выделили только (*pool) - весь кусочек памяти.В этом случае вам следовало использовать два malloc — один для структуры управления (пула) и один для массива items*.

Уточнение:ты не можешь перераспределить часть выделенной памяти - только весь выделенный фрагмент.Также обратите внимание, что вам следует сначала проверить результат realloc, прежде чем заменять исходный указатель в хорошо написанном коде - в противном случае, если realloc завершится неудачно, вы потеряете ранее выделенный блок памяти.

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

struct _Pool {
    Item ** items;
    unsigned int itemsCount;
    unsigned int poolSize;
    unsigned int poolStep;
};

маллок:*** ошибка для объекта 0x19dba8:указатель перераспределен не был выделен

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

(*pool)->items = realloc((*pool)->items, sizeof(Item *)*((*pool)->poolSize + (*pool)->poolStep));;

Для получения дополнительной помощи покажите нам, как инициализировать элементы.

Вероятно, вы забыли инициализировать *items в структуре и гоняетесь за диким указателем.

Вот метод создания пула:

void Pool_create(Pool ** pool, unsigned int poolSize)
{   
    unsigned int poolMemSize = sizeof(Pool) + sizeof(Item *)*poolSize;
    *pool = malloc(poolMemSize);
    if (!*pool) return;
    memset(*pool,0,poolMemSize);

    (*pool)->itemsCount = 0;
    (*pool)->poolSize = poolSize;
    (*pool)->poolStep = POOL_STEP;

    (*pool)->items = (Item **)((char*)(*pool) + sizeof(Pool));
    if(!(*pool)->items) return;
    memset((*pool)->items, 0, sizeof(Item *) * poolSize);
}

Как я уже сказал, если я хочу, например, вставить 1000 элементов и выделить память с помощью функции создания, тогда все будет работать нормально, если я объявлю стартовый размер пула для 100 элементов, а затем захочу перераспределить элементы, я получу ошибку.

Большое спасибо за такой быстрый ответ.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top