**结构的realloc问题

时间:2009-07-02 17:56:44

标签: c pointers realloc

我在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个元素的启动池大小然后我想重新分配项目我得到错误。

非常感谢您的快速回答。

4 个答案:

答案 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个元素的启动池大小然后我想重新分配项目我得到错误。

非常感谢您的快速回答。