2016-09-23 76 views
-7

我有這個代碼,我寫道,將數組0這段代碼如何工作沒有任何錯誤?

int arr[4]; 
memset(arr, 0, sizeof (arr)); 

很簡單,但代碼是如何工作的,沒有任何錯誤,即使sizeof(arr) = 16(4數組的大小* 4 INT)和大小我使用時,我宣佈數組是4,如何memset設置16位爲零,我通過作爲參數的數組大小爲4?

我用memset(arr, 0, sizeof(arr)/sizeof(*arr));來獲得數組的實際大小,結果是準確的,它給了我4但上述代碼如何正確工作?

+0

在對SO提出問題之前,請先閱讀該功能的文檔。 – user3286661

+0

爲什麼你使用上個世紀的函數來繞開C++中的內存? – user463035818

+2

「memset如何將16位設置爲零」它將16 _bytes_設置爲零,假設sizeof(arr)== 16。 – davmac

回答

1

memset組16個字節(而不是位)爲0。這是正確的,因爲你的陣列的大小是16個字節,因爲你正確地指出(4個整數x 4每整數個字節)。 sizeof知道數組中元素的數量,它知道每個元素的大小。正如你在文檔中看到的那樣,memset的第三個參數需要的是字節數,而不是元素數量。 http://www.cplusplus.com/reference/cstring/memset/

但要小心使用sizeof(),你通過數組作爲int x[]int* x。例如下面這段代碼不會做你期望的:

void foo(int arr[]) { 
    auto s = sizeof(arr); // be careful! this won't do what you expect! it will return the size of pointer to array, not the size of the array itself 
    ... 
} 

int a[10]; 
foo(a); 
0

第三個參數是字節數。你的情況是4 * 4 = 16。

memset

0

其實第一個解決方案是正確的。

函數memset將第三個參數作爲的字節數設置爲零。

NUM: 的字節數被設置爲的值。

sizeof返回該表達式佔用的字節數。

在你的情況下sizeof(arr) = 16這正好是由memset函數請求的字節數。


你的第二溶液:

memset(arr, 0, sizeof(arr)/sizeof(*arr)); // Note that: sizeof(arr)/sizeof(*arr) == 16/4 (generally) == 4 bytes 

將只設置前4個字節爲零,即該陣列的第一個整數。因此,如果您的意圖是將數組的每個元素設置爲零,那麼解決方案是錯誤的。