2

我在 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 的 *** 错误:未分配正在重新分配的指针

你能帮我解决我的问题吗?


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 函数分配内存,那么如果我声明 100 个元素的启动池大小然后我想重新分配项目,那么一切正常,我得到了错误。

非常感谢你这么快的回答。

4

4 回答 4

1

但是(*pool)->items从来没有分配过!您只分配(*pool)了 - 整个内存片。在这种情况下,您应该使用两个 malloc - 一个用于控制结构(池),一个用于 items* 数组。

澄清:您不能重新分配分配的内存的一部分- 只有整个 malloc'ed 块。另请注意,您应该先测试 realloc 的结果,然后再用编写良好的代码替换原始指针 - 否则如果 realloc 失败,您将丢失先前分配的内存块。

于 2009-07-02T18:16:31.023 回答
0
struct _Pool {
    Item ** items;
    unsigned int itemsCount;
    unsigned int poolSize;
    unsigned int poolStep;
};

malloc:对象 0x19dba8 的 *** 错误:未分配正在重新分配的指针

您是否使用 malloc 为项目分配内存?该消息似乎在告诉您不是。Realloc 应该用于使用类似 malloc 的函数分配的内存。

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

如需进一步帮助,请向我们展示您如何初始化项目。

于 2009-07-02T18:01:18.363 回答
0

您可能忘记初始化结构中的 *items 并且正在追逐一个野指针。

于 2009-07-02T18:03:23.663 回答
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 函数分配内存,那么如果我声明 100 个元素的启动池大小然后我想重新分配项目,那么一切正常,我得到了错误。

非常感谢你这么快的回答。

于 2009-07-02T18:12:33.760 回答