我需要你帮助理解memset行为。
char *data = malloc(40);
memset(data,1,40);
当我看到数据内容时,它是010101010101010直到大小结束。然后我改为此。
memset(data,~0,40);
我看到正确的内容为11111111直到结束。将值设置为1和~0之间的区别是什么。谢谢你的时间。
答案 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