使用realloc展开结构数组

时间:2013-06-15 10:46:50

标签: c arrays dynamic struct realloc

我通过类似的函数传递结构...

expandArrayofStructs(Container *container, int n)

这个容器是一个结构,在该结构内部是另一种结构的数组,我称之为内部结构。

我想将内部数组的大小扩展一些值,然后在扩展数组后继续使用我的原始函数。因此,这个扩展函数不返回任何内容,而只是调用它并扩展数据并完成,程序继续使用比以前更大的新数组。

我对情况的理解是这样的,但这不能正常工作......

int expandArrayofStructs(Container *container, int n)
{
   container->inner = realloc(container->inner, sizeof(inner) * 50);
                                                                ^
                                                   Just a number i picked. so if i 
                                                   already had an  array of 50
                                                   I would be increasing by 50 here.

  if(Container->inner == NULL)
    //HANDLE ERROR IF REALLOC FAILS

  //Update the container length
  container->length = container->length + 50;

  //For some reason the specs of the program say I need to return 
  //the array length which is an attribute of container
  return container->length;
}

但是当我以这种方式重新分配时,我甚至没有得到段错误: realloc():无效的下一个大小0x463829

最后的数字各不相同。

不确定我做错了什么,但如果有更好的方法动态重新分配结构数组,那么我愿意接受建议。这个特殊的代码不一定是它的本质。

唯一的规定是此函数返回int类型,即=新数组长度

5 个答案:

答案 0 :(得分:2)

发生此错误是因为您没有“重新分配”更多内存。您分配的大小相同。

要修复它,只需分配您需要的总大小:

container->inner = realloc(container->inner, sizeof(inner) * (50 + container->length);

答案 1 :(得分:0)

新分配的大小应该基于数组元素的大小,而不是基于指向数组开头的指针的大小。您还想要相对于当前长度调整它的大小:

container->inner = realloc(container->inner, sizeof(*container->inner) * (container->length + 50));

答案 2 :(得分:0)

假设您的结构定义如下所示:

typedef struct { ... } Inner;
typedef struct { ...; Inner *inner;  size_t length; } Container;

然后你的功能看起来像

size_t expandArrayOfStruct( Container *container, size_t extent )
{
  Inner *tmp = realloc( container->inner, 
                        sizeof *container->inner * (container->length + extent) );
  if ( tmp )
  {
    container->length += extent;
    container->inner = tmp;
  }

  return container->length;
}

您想将realloc的结果分配给临时变量;如果操作失败,realloc将返回NULL,如果将其分配给原始指针,您将丢失对已分配的内存的引用,从而导致内存泄漏。

您也可以将此功能用于原始分配:

int main( void )
{
  Container c = {..., NULL, 0 };
  size_t len = expandArrayOfStruct( &c, 50 );
  if ( len != 50 )
  {
    // allocation failed
  }
  ...
}

答案 3 :(得分:0)

你必须分配新的记忆,而你不能这样做。

int expandArrayofStructs(Container *container, int n)
{
  container->inner = realloc(container->inner, sizeof(inner) * (50 + container->length));
  if(Container->inner == NULL)
  /* return -1; (set realloc handle errors properly)*/

  container->length = container->length + 50;

  return container->length;
}

答案 4 :(得分:0)

为什么不阅读手册页(参见http://linux.die.net/man/3/realloc)。您每次使用相同的尺寸。此外 - 为什么不使用链表?