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,而在第二种情况下,它是 0xFF(全为)。这就是为什么你正在观察这种差异。

于 2012-10-26T09:22:10.377 回答
1

我认为您可能会将按位非 (~) 与逻辑非 (!) 混淆。

~0 反转所有位,给你 -1(所有位设置)
!0 会给你 1。

话虽如此,我看不到您可能会看到“0101 ...”和“1111 ...”,除非您无意中以十六进制给出第一个输出,而以二进制给出第二个输出。我希望看到“0101 ...”和“ffff ...”或“00000010000001 ...”和“1111111111111111 ...”。

于 2012-10-26T09:36:59.117 回答
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 回答