web-dev-qa-db-ja.com

C動的配列の初期化

Mallocで割り当てられた動的配列を初期化するにはどうすればよいですか?これを行うことができます:

int *p;
p = malloc(3 * sizeof(*p));
p = {0, 1, 2};

...

free(p);

または、私はこのようなことをする必要があります:

int *p, x;
p = malloc(3 * sizeof(*p));
for (x = 0; x < 3; x++)
    p[x] = 0;

...

free(p);

またはそれを行うためのより良い方法はありますか?

12
user2381799

メモリのブロックを割り当て、次のように配列として使用する必要があります。

_int *arr = malloc (sizeof (int) * n); /* n is the length of the array */
int i;

for (i=0; i<n; i++)
{
  arr[i] = 0;
}
_

ゼロで配列を初期化する必要がある場合は、stdlibのmemset関数も使用できます。

_memset (arr, 0, sizeof (int) * n);
_

ここで_0_は、配列のすべてのロケートインが設定される定数です。最後の引数は定数を設定するバイト数であることに注意してください。配列の各場所には整数が格納されるため、このパラメーターとして合計バイト数を渡す必要があります。

また、配列をゼロにクリアする場合は、callocの代わりにmallocを使用することもできます。 callocは、割り当てられたバイト位置をゼロに設定した後、メモリブロックを返します。

完了したら、メモリブロックfree (arr)を解放します。

EDIT1

memsetを使用して整数配列の位置に特定の整数を割り当てたい場合は問題になることに注意してください。これは、memsetが配列をバイト配列として解釈し、指定したバイトを配列のすべてのバイトに割り当てるためです。したがって、たとえば11243を各場所に保存する場合、それは不可能です。

EDIT2

また、memsetを使用してint配列を0に設定するたびに機能しない場合があることに注意してください: @Shafik Yaghmourが指摘したように、整数配列を-1にクリアしませんか?

19
phoxis

使用する代わりに

int * p;
p = {1,2,3};

私たちは使用できます

int * p;
p =(int[3]){1,2,3};
17
EnterKEY

提案した構文は使用できません。ただし、C99コンパイラを使用している場合、これを行うことができます。

int *p;

p = malloc(3 * sizeof p[0]);
memcpy(p, (int []){ 0, 1, 2 }, 3 * sizeof p[0]);

コンパイラがC99複合リテラルをサポートしていない場合は、名前付きテンプレートを使用して以下からコピーする必要があります。

int *p;

p = malloc(3 * sizeof p[0]);
{
    static const int p_init[] = { 0, 1, 2 };
    memcpy(p, p_init, 3 * sizeof p[0]);
}
4
caf

p = {1,2,3}は間違っています。

これは決して使用できません:

int * p;
p = {1,2,3};

ループは正しい

int *p,i;
p = malloc(3*sizeof(int));
for(i = 0; i<3; ++i)
    p[i] = i;
3
Lidong Guo

もっと退屈な方法がそれを行う唯一の方法だと思います。私は最初のものを試しましたが、コンパイルされません(「...」をコメント化した後)

'C'に多くのショートカットはないと思います。ac

1
user763410