2012-10-26 46 views
1

我需要您的幫助來理解memset行爲。memset行爲

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

當我看到的數據內容是010101010101010,直到size.Then結束時,我改變了這一點。

memset(data,~0,40); 

我看到正確的內容爲11111111直到結束。將值設置爲1和〜0有什麼區別。謝謝你的時間。

+1

你會怎麼做,看 「0101010101010」?它是一個循環的printf嗎?或使用調試器?或者是什麼?如果他們有點,我會期待「000000010000000100000001 ..」 – Jack

+0

我沒有使用任何printf。當這個數據被髮送到服務器時,服務器日誌顯示了我的數據內容。不知道服務器如何打印這些值。 –

回答

7

memset填充提供的內存區域的每個字節與您指定的值。請注意,只有最後一個參數的最低有效字節纔會填充內存塊(即使其類型爲int)。

在第一種情況下,這個字節是0x01,而第二種情況下它是0xFF(全部是1)。這就是爲什麼你正在觀察這種差異。

1

我想你可能會混淆不符(〜)與邏輯不(!)。

〜0反轉所有位,給你-1(設置所有位)
!0會給你1

說到這,我沒有看到你,你可以看到「0101。 ..'和'1111 ...',除非你無意中以十六進制輸出第一個輸出,二進制輸出第二個輸出。我期望看到'0101 ...'和'ffff ...'或'00000010000001 ...'和'1111111111111111 ...'。

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 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