1

我正在编写一个函数来增加使用 malloc 创建的动态内存对象的大小。该函数应该作为参数接受一个指向要增加的内存块的指针、块的当前大小以及要增加的块的数量。

像这样的东西:

int getMoreSpace(void **pnt, int size, int add) {
    xxxxxx *tmp; /* a pointer to the same as pnt */
    if (tmp = realloc(pnt, (size+add)*sizeof(xxxxxx))) { /* get size of what pnt points to */
        *pnt=tmp;
        return 1;
    else return 0;
}

问题是无论 pnt 指向什么,我都希望该功能正常工作。我该如何做到这一点?

4

3 回答 3

9

这种类型的函数不可能工作,因为pnt它是本地的,并且一旦函数返回,新指针就会丢失。您可以采用类型参数,xxxxxx **以便可以更新指针,但随后您只能支持单一类型。

真正的问题是您正在为realloc. 只需realloc直接使用,因为它应该被使用。没有办法通过包装来使其更简单或更高效;它已经尽可能简单了。

于 2011-01-06T19:35:55.280 回答
2

您将大小作为参数传递。您可以使用便利宏使其看起来与您的函数相同:

#define getMoreSpace(P, SZ, ADD) getMoreSpaceFunc(&(P), sizeof(*(P)), (SZ), (ADD))

int getMoreSpace(void **pnt, size_t elem_size, int size, int add) {
    *pnt = ...
}

编辑以显示您的便利宏还需要添加引用调用语义。

于 2011-01-06T19:36:00.360 回答
1

将元素大小作为单独的参数传入:

int getMoreSpace(void **pnt, int size, int add, size_t eltSize) 
{     
  void *tmp;
  if (tmp = realloc(pnt, (size+add)*eltSize)) 
  { 
    *pnt=tmp;
    return 1;
  }
  else 
    return 0; 
} 
...

int *p = malloc(100 * sizeof *p);
...
if (!getMoreSpace(&p, 100, 20, sizeof *p))
{
  // panic
}

这是最直接的解决方案,如果不是最优雅的。C 只是不适合动态类型信息。

编辑

更改类型pnt以响应史蒂夫的评论。

正如 caf 指出的那样,即使按照史蒂夫的“修复”,这也行不通。R.的权利;不要这样做。

于 2011-01-06T20:31:18.157 回答