[英]Does ampersand in front of char's array affect scanf? Is it legit?
當我們通常輸入字符串時,我們這樣做:
#include <stdio.h>
int main()
{
char str[256];
scanf("%s",str);
//Other Operation
}
但是,今天,在編程課上,我的一個朋友寫了這樣的scanf
行:
scanf("%s",&str);
它通過編譯,並工作。
問題是,我想知道這是否在C中是“合法的”,還是只是一個未定義的行為?
它是未定義的行為(因為類型scanf()
期望是char *
,但是你傳入一個char (*)[256]
),但它通常“工作”(似乎工作),因為數組的地址通常是相同(關於指針的數值)作為其第一個元素的地址。
從官方文檔 :
如果此對象沒有適當的類型,或者無法在提供的空間中表示轉換結果, 則行為未定義。
(強調我的)
這是技術上未定義的行為。 但是,這兩種方法在char數組的實踐中都有效,因為str
傳遞給scanf()
的引用變成了指向第一個元素的指針,它與指向數組本身的指針( str
的地址或者&str
相等*。 ),所以相同的值以任何一種方式傳遞。
我不確定你到目前為止是否只使用字符串,但請記住,如果你看一下不是數組的東西,就更容易判斷你朋友的方法是否正確:
int myInt;
scanf("%d", &myInt);
scanf()
正在尋找一個指針,所以你想給它一個整數變量的地址。 這是因為經過myInt
給它一個值(目前垃圾),而&myInt
告訴它在哪里把它讀值。
* Win16除外。
str
和&str
都被定義為獲取數組第一個元素的內存地址的值。 盡管H2CO3表明這是不確定的行為,但這在實踐中始終有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.