13

私は任意の値の配列を持っているので、それを void ポインターの配列として定義したので、あらゆる種類の情報 ( int、文字配列など) を指すことができます。ただし、実際に を割り当てるにはどうすればよいintですか?

たとえば、次の初期化を行います。

void* data[10];
int x = 100;

私の直感はこれを考えるでしょうが、これはコンパイルエラーを引き起こします:

data[0] = malloc(sizeof(int));
*(data[0]) = x;

また&x、を使用することも考えましたが、ローカル変数のアドレスを取得し、(私の理解では) プロシージャを終了した後にクリアされます。では、ローカル変数がある場合x、それを void ポインター型の変数に正しく入れるにはどうすればよいでしょうか?

4

5 に答える 5

29
*((int*)data[0])=x;

やります。

ユニオンの使用を検討することをお勧めします。このようなもの:

union myvalues
{
    int i;
    double d;
    long l;
};

あなたはそれから持つことができます

union myvalues *foo[10];
foo[0] = malloc(sizeof(union myvalues));
foo[0]->i = x;

typedefユニオン もできます。sizeof(union myvalues)メンバーの最大数になりsizeofます。したがって、共用体にint i;andがある場合は40 になります。に書き込むと、最初の 4 文字が上書きされます (int が 4 バイトであると仮定します)。char c[40]sizeof(union myvalues)ic

于 2009-08-25T11:17:23.047 に答える
11
*((int *)data[0]) = x;

x のコピーが作成されるため、ローカル変数であるという事実は重要ではありません。

于 2009-08-25T11:16:32.020 に答える
4

エイリアシングの理由により、実行する方がはるかに優れています

mempcy( data[0], &x, sizeof( int ) );

sizeof( int ) は定数値であるため、たまたまコンパイラは memcpy 呼び出しを最適化しますが、さまざまなエイリアシング ルールに違反することはありません。

于 2009-08-25T11:37:07.937 に答える
2

キャストを使用して割り当てを行うこともできますが、次のようにコードを記述した方がおそらくはるかにクリーンです。

ボイド * データ [ 10 ];
整数 x = 100;
int *p;

p = malloc( sizeof *p );
データ [ 0 ] = p;
*p = x;
于 2009-08-25T11:40:20.177 に答える
1

これを試して:

data[0] = malloc(sizeof(int));
*((int*)data[0]) = x;

また

(int) (*(data[0])) = x;

忘れないで

free (data[0]);

その後。

于 2009-08-25T12:43:19.010 に答える