[英]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.