簡體   English   中英

靜態數組上的內存集

[英]memset on static array

當您必須設置靜態數組的元素時,對於將第一個參數傳遞給memset感到有些困惑。 我一直在搜索,但找不到某些特定問題的答案。

如果我有一個聲明為的數組:

char arr[10];

我已經看到這兩個調用是有效的,並且產生相同的效果:

memset( arr, 0, 10);
memset( &arr, 0, 10);

我的具體問題是:

1-為什么它們對arr有相同的影響?

2-這些呼叫之間有什么區別?

3-哪一個被認為是正確的?

謝謝!

儲存期限與它無關。 數組就是數組。 該表達式:

&arr

產生一個char (*)[10] ,即指向具有10個元素的char數組的指針。 但是,將arr傳遞給類似這樣的函數時:

memset(arr, 0, 10);

它降級為指向第一個元素的指針,即char* 這些不是一回事。 “正確的”(慣用的)調用是:

memset(arr, 0, 10);

但是,在這種情況下,它們在傳遞給memset時都轉換為void* ,並在函數中解釋為unsigned char* 由於它們都指向同一位置,因此產生相同的結果。

然而,要認識到,與真實相應類型(即,不是一個問題時是很重要的void* ),一個指針數組是一樣的指針數組的第一個元素。

例如,增加一個char (*)[10]將增加指針的sizeof(char[10])字節,而增加一個char*只會增加一個字節。

為什么它們對arr具有相同的作用? 這些電話之間有什么區別?

因為數組的地址與其第一個元素的地址相同(數組在傳遞給函數時會衰減為指向第一個元素的指針),因此它們的類型不同。 arr類型為char[10] ,當傳遞給函數時,它會衰減為char * 相反, &arr的類型為char (*)[10] ,當作為函數參數傳遞時不會改變。

哪一個被認為是正確的?

只要該函數不需要特定的類型,即它接受void * ,則任一個都是好的。 但是,如果所調用的函數期望指定兩種類型中的任何一種,則不應使用另一種類型,因為這樣您的程序將格式錯誤並調用未定義的行為。

1-為什么它們對arr有相同的影響?

它們都包含相同的值,該值是數組開頭的地址。

2-這些呼叫之間有什么區別?

arr衰減為char的指針,即char* (當您將數組的名稱傳遞給函數時會發生這種轉換), &arr是char的數組的指針,即char (*)[]

3-哪一個被認為是正確的?

我會用arr memset接受一個void* ,這就是兩者都起作用的原因。

另外,請注意char arr[10] = {}; 可用於將數組初始化為零。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM