2014-01-18 36 views
0

以下三個命令之間有什麼區別?使用memset函數的各種方式之間的區別

假設我們聲明一個有10個元素的數組arr。

int arr[10]; 

現在的命令是:

命令1:

memset(arr,0,sizeof(arr)); 

和 命令2:

memset(arr,0,10*sizeof(int)); 

這兩個命令都在一個程序運行平穩,但下面命令不是

命令3:

memset(arr,0,10); 

那麼究竟是什麼這3個命令的區別?

+0

你確定你使用C++而不是C嗎? –

+3

因爲int的大小通常不是1個字節。 – OldProgrammer

回答

1

memset(arr,0,sizeof(arr))填充arrsizeof(arr)零 - 作爲字節。 sizeof(arr)在這種情況下是正確的,但要小心在指針而不是數組上使用這種方法。

memset(arr,0,10*sizeof(int))填充arr10*sizeof(int)零,再次作爲字節。這在這種情況下再次是正確尺寸。這比第一個更脆弱。如果arr不包含10個元素,以及如果每個元素的類型不是int會怎樣。例如,您發現您正在發生溢出並將int arr[10]更改爲long long arr[10]

memset(arr,0,10)用零填充arr的前10個字節。這顯然不是你想要的。

這些都不是非常類似C++的。使用std::fill會更好,它可以從<algorithm>頭文件中獲得。例如,std::fill (a, a+10, 0)

5

情況#1:sizeof(arr)返回10 *的sizeof(int)的

情況#2:sizeof(int) * 10返回相同的事情

情況#3:10返回10

的int佔用超過一個字節(通常在32位上是4)。所以,如果你對案例三做了40,它可能會奏效。但從來沒有真的這樣做。

2

memset's 3rd paranneter是多少個字節來填充。所以在這裏你告訴memset設置10個字節:

memset(arr,0,10); 

arr不necesarrily 10個字節。 (其實並非如此)你需要知道有多少個字節都在arr之內,而不是多少個元素。

int的大小不保證是1個字節。在大多數現代PC型硬件上,它將是4個字節。

您不應該假定任何特定數據類型的大小,除了char,它確保爲1個字節。對於其他所有內容,您必須使用sizeof來確定它的大小(在編譯時)。

相關問題