48

memset整数の配列で使用することはできませんか? 次の呼び出しを試みましたが、配列memsetで正しい整数値を取得できませんでした。int

int arr[5];
memset (arr, -1, sizeof(arr)/sizeof(int));

私が得た値は次のとおりです。

arr[0] = -1
arr[1] = 255
arr[2] = 0
arr[3] = 0
arr[4] = 0
4

6 に答える 6

82

に変更するだけmemset (arr, -1, sizeof(arr));

0 と -1 以外の値の場合、これは機能しないことに注意してください。 memset*ptr、次のバイトに対して、 で示される変数で始まるメモリ ブロックのバイト値を設定するためnumです。

void * memset ( void * ptr, int value, size_t num );

また、intは複数のバイトで表されるため、配列内の整数に対して目的の値を取得できません。

例外:

  • すべてのバイトを 0 に設定すると値がゼロになるため、0 は例外です。
  • パトリックが強調したように、-1 は int8_t の 0xff (=255) と int32_t の 0xffffffff であるため、-1 は別の例外です。

あなたが得た理由:

arr[0] = -1
arr[1] = 255
arr[2] = 0
arr[3] = 0
arr[4] = 0

あなたの場合、intの長さは4バイト(32ビット表現)で、配列の長さは20バイト(= 5 * 4)であり、5バイトのみを-1(= 255)に設定しているためです。 20の代わりに。

于 2011-08-26T09:12:50.497 に答える
39

memset1 バイト データ型以外の初期化には使用しないでください。

一見すると、intto 0orの初期化には機能するはず-1ですが (多くのシステムでは機能します)、トラップ表現を生成して未定義の動作を引き起こす可能性を考慮していません。整数表現は必ずしも 2 の補数ではないという事実。

inttoの配列を初期化する正しい方法は、配列-1をループして、各値を明示的に設定することです。

于 2011-08-26T09:41:38.967 に答える
11

gcc は優れた配列初期化ショートカットを提供します

int arr[32] = {[0 ... 10] = 3, [11 ... 31] = 4}

前後のスペースに注意...

于 2014-04-14T11:17:21.797 に答える
6

なぜ分割?

memset(arr, -1, sizeof(arr));

あなたのバージョン はsizeof(arr)/sizeof(int)、配列内の要素の数を示します。

于 2011-08-26T09:10:48.627 に答える
4

配列を直接初期化することで、入力の手間を省くことができます。

int arr[5] = {-1, -1, -1, -1, -1}; 

その行は memset よりも短く、それも機能します。

于 2011-08-26T11:28:35.377 に答える