cで整数配列にmemsetを使用する
char str[]="beautiful earth";
memset(str,'*',6);
printf("%s",str);
output:
******ful earth
- 上記のmemsetの使い方と同様に、以下のようにいくつかの整数配列のインデックス値だけを1に初期化することは可能でしょうか?
int arr[15];
memset(arr,1,6);
29
10
いいえ、このように
memset()
を使用することはできません。manpage][1]にはこう書かれています(強調):int`は通常4バイトなので、これでは間に合いません。
もし、あなたが(※不正解!※)これをやろうとしたら:
とすると、配列の最初の6つの
int
は、実際には 0x010101 = 16843009 に設定されることになります。非バイトデータ型のデータの塊を書き込むことができるのは、
memset(thing, 0, sizeof(thing));
を使って文字列/配列全体をゼロにするときだけです。NULL、0x00000000、0.0はすべて完全に0であるため、これは有効です。解決策は、
for
ループを使い、自分で設定することです:短い答え、NOです。
長い答えですが、
memset
はバイトをセットし、文字はシングルバイトなので動作しますが、整数はそうではありません。memsetの第3引数はバイトサイズです。つまり、
arr[15]
の総バイトサイズを設定する必要があります。しかし、おそらくはarrの全要素に値1を設定したいはずです。その場合は、ループの中で設定したほうがよいでしょう。
memset()`は各バイトに1をセットするからです。ということで、期待はずれでした。
Linux、OSX、および「wchar_t」が32ビットで、「memset()」の代わりに「wmemset()」を使用できる他のUNIXのようなオペレーティングシステム。
MS-Windowsの
wchar_t
は16ビットであるため、このトリックが機能しない可能性があることに注意してください。いいえ、目的の目標値が「0」でない限り、その目的で「memset」を使用することはできません。
memset
は、ターゲットメモリ領域をint
の配列ではなく、バイトの配列として扱います。繰り返しパターンでメモリ領域を埋めるためのかなり人気のあるハックは、実際には「memcpy」に基づいています。 「memcpy」がデータを順方向にコピーするという期待に大きく依存しています。
もちろん、これはかなり醜いハックです。ソースと宛先のメモリ領域が重複する場合、標準の「memcpy」の動作は未定義です。 独自のバージョンの「memcpy」を作成して、データが順方向にコピーされていることを確認し、上記の方法で使用できます。 しかし、それは本当に価値がありません。 単純なサイクルを使用して、配列の要素を目的の値に設定します。
理想的には、memsetを使用して配列をすべて1に設定することはできません。< br /> memset はバイトで動作し、すべてのバイトを1に設定するためです。< br />。
したがって、一度読むと、 16843009 = 0x010101 = 10000001000000100000100000001 < br />と表示されます。 0x0000001 < br />ではありません。 ただし、requiremntがboolまたはbinary値のみの場合は、CライブラリにC99標準を使用して設定できます。
誰もそれを言及しなかったので。..
memsetを使用して値
1
で整数を初期化することはできませんが、値-1
で整数を初期化して、代わりに負の値で作業するようにロジックを変更できます。たとえば、配列の最初の6つの番号を「-1」で初期化するには、そうします。
さらに、この初期化を1回だけ行う必要がある場合は、コンパイル時からの値「1」で開始するように配列を実際に宣言できます。
Memsetは1バイトのデータ型の値を設定しますが、整数は4バイト以上あるため、機能せず、ガベージ値を取得します。 これは、charと文字列のタイプを使用しているときに主に使用されます。
次のプログラムを試しましたが、-1と0のみのmemset()を使用して配列を初期化できるようです。