2

memset の動作を理解するためにあなたの助けが必要です。

char *data = malloc(40);
memset(data,1,40);

データ内容を見たらサイズの最後まで010101010101010だったのでこれに変更。

memset(data,~0,40);

最後まで 11111111 と正しい内容を見ました。値を 1 と ~0 に設定した場合の違いは何ですか。御時間ありがとうございます。

4

3 に答える 3

8

memset指定したメモリ領域の各バイトを指定した値で埋めます。最後の引数の最下位バイトのみがメモリ ブロックに入力されることに注意してください (そのタイプが であってもint)。

最初のケースでは、このバイトは 0x01 ですが、2 番目のケースでは 0xFF (すべて 1) です。だからこそ、あなたはこの種の違いを観察しています。

于 2012-10-26T09:22:10.377 に答える
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
于 2012-10-26T09:53:57.820 に答える
1

ビット単位の否定 (~) と論理否定 (!) を混同している可能性があると思います。

~0 はすべてのビットを反転し、-1 を与えます (すべてのビットがセットされます)
!0 は 1 を与えます。

そうは言っても、うっかり最初の出力を 16 進数で、2 番目の出力を 2 進数で指定しない限り、'0101...' と '1111...' が表示されるとは思いません。「0101...」と「ffff...」または「00000010000001...」と「1111111111111111...」のいずれかが表示されると思います。

于 2012-10-26T09:36:59.117 に答える