2

構造内に存在する int の配列を memset しようとしています:

typedef struct _xyz {
    int zList[9000];
} xyz;

int dll_tmain(void)
{
    xyz *Xyz       =  (xyz *) calloc(10, sizeof(xyz));
    memset((&Xyz[0])->zList, 1, 9000);
}

memset() で多くのバリエーションを試しましたが、役に立ちませんでした。数値は 1 に初期化されるのではなく、巨大な値です。

4

2 に答える 2

4

配列のmemsetバイトを同じ値に設定することを思い出してください。したがって、配列の最初の 9000 バイトに値 1 のバイトをコピーしています。4 バイトの整数を想定すると、 value で int を割り当てていることになります0x01010101。しかし、さらに、配列全体に割り当てるのではなく、配列の最初の 1/4 のみに割り当てます。ここでも 4 バイトの整数を想定しています。

でやりたいことはできませんmemset。代わりに for ループを使用してください。

于 2012-05-03T22:39:04.950 に答える
1

設定したい「値」は int として memset に渡されますが、memset は「この値の unsigned char 変換を使用してメモリのブロックを埋めます」一度に 1 バイトです。

したがって、最初の 9000 バイトを値 0x01 に埋めています。int は通常、1 バイトではなく、2、4、または 8 バイトになります。

それを行うには、独自のループを作成するだけです。何らかの理由で自分で書きたくない場合は、システムに wmemset があるかどうかを確認してから、wchar_t が int と同じサイズかどうかを確認してください。

于 2012-05-03T22:52:26.297 に答える