2014-06-13 130 views
56

manpage說,大約memsetmemset如何通過-1初始化整數數組?

#include <string.h> 
void *memset(void *s, int c, size_t n) 

memset()函數填充的存儲區的第一n字節指向s與恆定字節c

很明顯,memset不能用於初始化int陣列,如下所示:

int a[10]; 
memset(a, 1, sizeof(a)); 

這是因爲int由4個字節(比如說)表示,並且一個不能得到所期望的數組a中整數的值。
但我經常看到程序員使用memsetint數組元素設置爲0-1

int a[10]; 
int b[10]; 
memset(a, 0, sizeof(a)); 
memset(b, -1, sizeof(b)); 

按我的理解,與整數0初始化是可以的,因爲0可以在1個字節(可能是我錯了,在這種情況下)來表示。但是如何用-1(4字節值)初始化b

+23

downvoter,小心解釋一下?這個問題與這個網站或別的東西無關嗎? – haccks

+0

你用'0'初始化的原因是錯的。這是可以的,因爲'0'適合'unsigned char'(所以當它作爲memset的第二個參數使用時,它不會被截斷)*和*,因爲'sizeof(int)'字節在內存中的位模式零與sizeof(int)'連續的單字節零的內存中的位模式相同。這兩件事情都必須是真實的。事實上,這些事情對於兩個數字中的兩個數字是正確的:「0」和「-1」。 – zwol

回答

65

奇怪的是,這可與-1的原因是完全相同的,這可與零的原因:在two's complement binary representation-1具有1 S IN其所有位,而不管該整數的大小,在一個區域,以便填充字節填充全部1 s在二進制補碼硬件上產生-1的區域int s,long s和short s。

在不同於二進制補碼的硬件上,結果會有所不同。整數常量將被轉換爲全部爲1的unsigned char,因爲該標準特定於如何執行轉換。但是,根據平臺的規則,將所有位設置爲1的字節區域解釋爲整數值。例如,在符號和數值硬件上,數組的所有元素都將包含相應類型的最小負值。

+15

不會使用'〜0'有效地相同(並且更清晰)? –

+2

@FiddlingBits是的,使用'〜0'肯定會避免這裏的混亂。 – dasblinkenlight

+0

我得到了你的答案,但你能解釋這一行:*如此填寫-1字節的區域會產生一個-1符號的整數,長整數和短整數的區域。 – haccks