以下三個命令之間有什麼區別?使用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個命令的區別?
以下三個命令之間有什麼區別?使用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個命令的區別?
memset(arr,0,sizeof(arr))
填充arr
與sizeof(arr)
零 - 作爲字節。 sizeof(arr)
在這種情況下是正確的,但要小心在指針而不是數組上使用這種方法。
memset(arr,0,10*sizeof(int))
填充arr
與10*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)
。
情況#1:sizeof(arr)
返回10 *的sizeof(int)的
情況#2:sizeof(int) * 10
返回相同的事情
情況#3:10
返回10
的int佔用超過一個字節(通常在32位上是4)。所以,如果你對案例三做了40
,它可能會奏效。但從來沒有真的這樣做。
memset
's 3rd paranneter是多少個字節來填充。所以在這裏你告訴memset
設置10個字節:
memset(arr,0,10);
但arr
不necesarrily 10個字節。 (其實並非如此)你需要知道有多少個字節都在arr
之內,而不是多少個元素。
int
的大小不保證是1個字節。在大多數現代PC型硬件上,它將是4個字節。
您不應該假定任何特定數據類型的大小,除了char
,它確保爲1個字節。對於其他所有內容,您必須使用sizeof
來確定它的大小(在編譯時)。
你確定你使用C++而不是C嗎? –
因爲int的大小通常不是1個字節。 – OldProgrammer