我需要您的幫助來理解memset行爲。memset行爲
char *data = malloc(40);
memset(data,1,40);
當我看到的數據內容是010101010101010,直到size.Then結束時,我改變了這一點。
memset(data,~0,40);
我看到正確的內容爲11111111直到結束。將值設置爲1和〜0有什麼區別。謝謝你的時間。
我需要您的幫助來理解memset行爲。memset行爲
char *data = malloc(40);
memset(data,1,40);
當我看到的數據內容是010101010101010,直到size.Then結束時,我改變了這一點。
memset(data,~0,40);
我看到正確的內容爲11111111直到結束。將值設置爲1和〜0有什麼區別。謝謝你的時間。
memset
填充提供的內存區域的每個字節與您指定的值。請注意,只有最後一個參數的最低有效字節纔會填充內存塊(即使其類型爲int
)。
在第一種情況下,這個字節是0x01,而第二種情況下它是0xFF(全部是1)。這就是爲什麼你正在觀察這種差異。
我想你可能會混淆不符(〜)與邏輯不(!)。
〜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 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
你會怎麼做,看 「0101010101010」?它是一個循環的printf嗎?或使用調試器?或者是什麼?如果他們有點,我會期待「000000010000000100000001 ..」 – Jack
我沒有使用任何printf。當這個數據被髮送到服務器時,服務器日誌顯示了我的數據內容。不知道服務器如何打印這些值。 –