Проблема с перераспределением **struct
Вопрос
У меня проблема с функцией 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 элементов, а затем захочу перераспределить элементы, я получу ошибку.
Большое спасибо за такой быстрый ответ.