簡體   English   中英

char數組前面的&符是否會影響scanf? 它合法嗎?

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

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