web-dev-qa-db-ja.com

C:mallocを使用して配列を拡張する

私は一般的にmallocとCに少し新しいです。必要に応じて、固定サイズの配列のサイズをmallocで拡張する方法を知りたいと思いました。

例:

#define SIZE 1000
struct mystruct
{
  int a;
  int b;
  char c;
};
mystruct myarray[ SIZE ];
int myarrayMaxSize = SIZE;
....
if ( i > myarrayMaxSize )
{
   // malloc another SIZE (1000) elements
   myarrayMaxSize += SIZE;
}
  • 上記の例は、私が達成したいことを明確にするはずです。

(ちなみに、私が書くインタープリターにはこれが必要です:固定量の変数を処理し、さらに必要な場合は、動的に割り当てるだけです)

21
Mal Ock

realloc を使用しますが、最初にmallocを使用して配列を割り当てる必要があります。上記の例では、それをスタックに割り当てています。

   size_t myarray_size = 1000;
   mystruct* myarray = malloc(myarray_size * sizeof(mystruct));

   myarray_size += 1000;
   mystruct* myrealloced_array = realloc(myarray, myarray_size * sizeof(mystruct));
   if (myrealloced_array) {
     myarray = myrealloced_array;
   } else {
     // deal with realloc failing because memory could not be allocated.
   }
19
i_am_jorf

(他のポスターがすでに指摘しているように)reallocを使用したい。しかし、残念ながら、他のポスターはそれを正しく使用する方法を示していません:

POINTER *tmp_ptr = realloc(orig_ptr, new_size);
if (tmp_ptr == NULL)
{
    // realloc failed, orig_ptr still valid so you can clean up
}
else
{
    // Only overwrite orig_ptr once you know the call was successful
    orig_ptr = tmp_ptr;
}

reallocが失敗した場合に元のポインタが失われないように、tmp_ptrを使用する必要があります。

16

いいえ、できません。いったん定義されると、スタック上の配列のサイズを変更することはできません。これは、固定サイズの意味です。またはグローバル配列のいずれか:myarrayが定義されているコードサンプルからは明らかではありません。

1000要素の配列をmallocし、後でreallocでサイズを変更できます。これにより、古い配列のデータのコピーを含む新しい配列が返されますが、最後に余分なスペースがあります。

7
Steve Jessop

a)mallocを使用して作成しなかったため、mallocで拡張できない。行う:

  mystruct *myarray = (mystruct*)malloc(sizeof( mystruct) *SIZE);

b)realloc(RTM)を使用して大きくする

1
pm100