memset の動作を理解するためにあなたの助けが必要です。
char *data = malloc(40);
memset(data,1,40);
データ内容を見たらサイズの最後まで010101010101010だったのでこれに変更。
memset(data,~0,40);
最後まで 11111111 と正しい内容を見ました。値を 1 と ~0 に設定した場合の違いは何ですか。御時間ありがとうございます。
memset
指定したメモリ領域の各バイトを指定した値で埋めます。最後の引数の最下位バイトのみがメモリ ブロックに入力されることに注意してください (そのタイプが であってもint
)。
最初のケースでは、このバイトは 0x01 ですが、2 番目のケースでは 0xFF (すべて 1) です。だからこそ、あなたはこの種の違いを観察しています。
また、次の方法で gdb で確認できます。
コード:
#include <stdio.h>
#include <string.h>
int main ()
{
char *data = malloc (20);
memset (data, 1, 20);
printf (".... %s ", data);
memset ( data, ~0, 20);
printf (" \n .... %s.. ", data );
}
メインにブレークポイントを設定します。
GDB 出力:
Breakpoint 1, main () at mymemset.c:6
6 char *data = malloc (20);
(gdb) n
7 memset (data, 1, 20);
(gdb) n
8 printf (".... %s ", data);
(gdb) x/20b data
0x1001008a0: 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01
0x1001008a8: 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01
0x1001008b0: 0x01 0x01 0x01 0x01
(gdb) n
10 memset ( data, ~0, 20);
(gdb) n
11 printf (" \n .... %s.. ", data );
(gdb) x/20b data
0x1001008a0: 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff
0x1001008a8: 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff
0x1001008b0: 0xff 0xff 0xff 0xff
(gdb) Quit
ビット単位の否定 (~) と論理否定 (!) を混同している可能性があると思います。
~0 はすべてのビットを反転し、-1 を与えます (すべてのビットがセットされます)
!0 は 1 を与えます。
そうは言っても、うっかり最初の出力を 16 進数で、2 番目の出力を 2 進数で指定しない限り、'0101...' と '1111...' が表示されるとは思いません。「0101...」と「ffff...」または「00000010000001...」と「1111111111111111...」のいずれかが表示されると思います。