私は一般的に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;
}
(ちなみに、私が書くインタープリターにはこれが必要です:固定量の変数を処理し、さらに必要な場合は、動的に割り当てるだけです)
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.
}
(他のポスターがすでに指摘しているように)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
を使用する必要があります。
いいえ、できません。いったん定義されると、スタック上の配列のサイズを変更することはできません。これは、固定サイズの意味です。またはグローバル配列のいずれか:myarray
が定義されているコードサンプルからは明らかではありません。
1000要素の配列をmalloc
し、後でrealloc
でサイズを変更できます。これにより、古い配列のデータのコピーを含む新しい配列が返されますが、最後に余分なスペースがあります。
a)mallocを使用して作成しなかったため、mallocで拡張できない。行う:
mystruct *myarray = (mystruct*)malloc(sizeof( mystruct) *SIZE);
b)realloc(RTM)を使用して大きくする