我在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时,我遇到了这样的错误:
对象0x19dba8的malloc:***错误: 重新分配的指针不是 分配
你能帮我解决一下我的问题吗?
以下是Pool的创建方法:
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 function分配内存,那么一切正常,如果我声明100个元素的启动池大小然后我想重新分配项目我得到错误。
非常感谢您的快速回答。
答案 0 :(得分:1)
但(*pool)->items
从未分配过!您只分配了(*pool)
- 整个内存片段。在这种情况下,您应该使用两个malloc - 一个用于控制结构(Pool),另一个用于items *数组。
澄清:你不能重新分配已分配内存的部分 - 只有整个malloc的块。 另请注意,在替换良好编写的代码中的原始指针之前,应首先测试realloc的结果 - 否则,如果realloc失败,则会丢失先前分配的内存块。
答案 1 :(得分:0)
struct _Pool {
Item ** items;
unsigned int itemsCount;
unsigned int poolSize;
unsigned int poolStep;
};
对象0x19dba8的malloc:***错误: 重新分配的指针不是 分配
您是否为具有malloc的项目分配内存?这条消息似乎在暗示你不是。 Realloc应该用于分配了类似malloc的函数的内存。
(*pool)->items = realloc((*pool)->items, sizeof(Item *)*((*pool)->poolSize + (*pool)->poolStep));;
如需进一步的帮助,请告诉我们如何初始化项目。
答案 2 :(得分:0)
你可能忘了在结构中初始化*项目并且正在追逐一个狂野的指针。
答案 3 :(得分:0)
以下是Pool的创建方法:
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 function分配内存,那么一切正常,如果我声明100个元素的启动池大小然后我想重新分配项目我得到错误。
非常感谢您的快速回答。