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
に変更するだけmemset (arr, -1, sizeof(arr));
0 と -1 以外の値の場合、これは機能しないことに注意してください。 memsetは*ptr
、次のバイトに対して、 で示される変数で始まるメモリ ブロックのバイト値を設定するためnum
です。
void * memset ( void * ptr, int value, size_t num );
また、int
は複数のバイトで表されるため、配列内の整数に対して目的の値を取得できません。
例外:
あなたが得た理由:
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の代わりに。
memset
1 バイト データ型以外の初期化には使用しないでください。
一見すると、int
to 0
orの初期化には機能するはず-1
ですが (多くのシステムでは機能します)、トラップ表現を生成して未定義の動作を引き起こす可能性を考慮していません。整数表現は必ずしも 2 の補数ではないという事実。
int
toの配列を初期化する正しい方法は、配列-1
をループして、各値を明示的に設定することです。
gcc は優れた配列初期化ショートカットを提供します
int arr[32] = {[0 ... 10] = 3, [11 ... 31] = 4}
前後のスペースに注意...
なぜ分割?
memset(arr, -1, sizeof(arr));
あなたのバージョン はsizeof(arr)/sizeof(int)
、配列内の要素の数を示します。
配列を直接初期化することで、入力の手間を省くことができます。
int arr[5] = {-1, -1, -1, -1, -1};
その行は memset よりも短く、それも機能します。