20

単純な C プログラムを実行しようとしていますが、次のエラーが発生します。

警告: フォーマット '%s' はタイプ 'char *' を想定していますが、引数 2 のタイプは 'char (*)[20]' です</p>

Mac OSX Mountain Lion を実行し、gcc 4.2.1 を使用してターミナルでコンパイル

#include <stdio.h>

int main() {
    char me[20];

    printf("What is your name?");
    scanf("%s", &me);
    printf("Darn glad to meet you, %s!\n", me);

    return (0);
}
4

3 に答える 3

45
于 2013-05-15T16:47:01.273 に答える
4

sizeof_Alignof、または単項演算子のオペランドである場合、または宣言で配列を初期化するために使用される文字列リテラルである場合を除いて&、型 "N 要素配列 " の式はT変換 ("decay") されます。タイプ「ポインター」の式Tであり、配列内の最初の要素のアドレスに評価されます。

配列mechar;の 20 要素の配列として宣言されます。通常、 meがコードに現れると、「ポインタへの」型の式として扱われますchar。もし書いていたら

scanf("%s", me);

その場合、エラーは発生しません。式meは正しい型の式に変換されます。

ただし、演​​算子を使用すると、&そのルールを回避できます。へのポインターの代わりに、( )の配列charへのポインターを渡しています。これは、変換指定子に期待されるものではないため、診断になります。charchar (*)[20]scanf%s

于 2013-05-15T17:08:43.180 に答える