0

私はそのような関数を介して構造体を渡しています...

expandArrayofStructs(Container *container, int n)

このコンテナーは 1 つの構造体であり、その構造体の内部には別のタイプの構造体の配列があり、これをインナーと呼びます。

内部の配列のサイズをある値だけ拡張し、配列が拡張された後に元の関数を続行したいと思います。したがって、この展開関数は何も返さず、単に呼び出されてデータを展開して終了し、プログラムは以前よりも大きな新しい配列で続行します。

状況の私の理解はこのようなものですが、これは適切に機能しません...

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;
}

しかし、この方法で再割り当てすると、segfault エラーも発生しません。 realloc(): 次のサイズが無効です 0x463829

末尾の数字は異なります。

何が間違っているのかわかりませんが、構造体の配列を動的に再割り当てするより良い方法があれば、提案を受け付けています。この特定のコードは、正確である必要はありません。

唯一の規定は、この関数が型 int を返すことです = 新しい配列の長さ

4

5 に答える 5

2

このエラーは、メモリを「再割り当て」していないために発生します。同じサイズを割り当てています。

それを修正するには、必要な合計サイズを割り当てるだけです:

container->inner = realloc(container->inner, sizeof(inner) * (50 + container->length);
于 2013-06-15T11:03:25.070 に答える
0

新しく割り当てられるサイズは、配列の先頭へのポインターのサイズではなく、配列の要素のサイズに基づく必要があります。また、現在の長さに対して相対的にサイズを変更したい:

container->inner = realloc(container->inner, sizeof(*container->inner) * (container->length + 50));
于 2013-06-15T10:59:04.860 に答える
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一時変数に代入します。操作が失敗した場合はreallocNULL を返し、それを元のポインターに割り当てると、既に割り当てられているメモリへの参照が失われ、メモリ リークが発生します。

この関数を元の割り当てにも使用できます。

int main( void )
{
  Container c = {..., NULL, 0 };
  size_t len = expandArrayOfStruct( &c, 50 );
  if ( len != 50 )
  {
    // allocation failed
  }
  ...
}
于 2013-06-15T11:07:53.433 に答える