0

我通过这样的函数传递一个结构......

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(): invalid next size 0x463829

最后的数字各不相同。

不知道我做错了什么,但如果有更好的方法来动态重新分配结构数组,那么我愿意接受建议。这个特定的代码不必完全是它的样子。

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

4

5 回答 5

2

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

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

container->inner = realloc(container->inner, sizeof(inner) * (50 + container->length);
于 2013-06-15T11:03:25.070 回答
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;
}
于 2013-06-15T11:10:34.693 回答
0

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

于 2013-06-15T11:10:42.147 回答
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
  }
  ...
}
于 2013-06-15T11:07:53.433 回答
0

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

container->inner = realloc(container->inner, sizeof(*container->inner) * (container->length + 50));
于 2013-06-15T10:59:04.860 回答