C の realloc 関数に問題があります。次のコードを渡します。
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 を呼び出すと、次のようなエラーが発生します。
malloc: *** オブジェクト 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個のアイテムを挿入し、create関数によってメモリを割り当てたい場合、100個の要素の開始プールサイズを宣言してからアイテムを再割り当てしたい場合、エラーが発生します。
このような迅速な回答をありがとうございました。