我需要你的帮助来理解 memset 的行为。
char *data = malloc(40);
memset(data,1,40);
当我看到数据内容时,它是 010101010101010 直到大小结束。然后我改为这个。
memset(data,~0,40);
我看到正确的内容为 11111111 直到结束。将值设置为 1 和 ~0 之间有什么区别。谢谢你的时间。
memset
用您指定的值填充提供的内存区域的每个字节。请注意,只有最后一个参数的最低有效字节被用来填充内存块(即使它的类型是int
)。
在您的第一种情况下,此字节是 0x01,而在第二种情况下,它是 0xFF(全为)。这就是为什么你正在观察这种差异。
我认为您可能会将按位非 (~) 与逻辑非 (!) 混淆。
~0 反转所有位,给你 -1(所有位设置)
!0 会给你 1。
话虽如此,我看不到您可能会看到“0101 ...”和“1111 ...”,除非您无意中以十六进制给出第一个输出,而以二进制给出第二个输出。我希望看到“0101 ...”和“ffff ...”或“00000010000001 ...”和“1111111111111111 ...”。
另外,可以通过以下方式在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