memset行为

时间:2012-10-26 09:19:53

标签: c string

我需要你帮助理解memset行为。

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

当我看到数据内容时,它是010101010101010直到大小结束。然后我改为此。

memset(data,~0,40);

我看到正确的内容为11111111直到结束。将值设置为1和~0之间的区别是什么。谢谢你的时间。

3 个答案:

答案 0 :(得分:7)

memset使用您指定的值填充所提供内存区域的每个字节。请注意,只有最后一个参数的最低有效字节用于填充内存块(即使其类型为int)。

在第一种情况下,这个字节是0x01,而在第二种情况下,它是0xFF(全部为1)。这就是你观察这种差异的原因。

答案 1 :(得分:1)

我认为你可能会因为符号而不是(〜)而不是逻辑而不是(!)。

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

说了什么,我没有看到你,你可能会看到'0101 ......'和'1111 ......',除非你无意中给出了十六进制的第一个输出和二进制的第二个输出。我希望看到'0101 ......'和'ffff ...'或'00000010000001 ......'和'1111111111111111 ......'。

答案 2 :(得分: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 );


}

将断点设为main。

GDB OUTPUT:

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