1

だから私は約 1 年間 C で何も書いていませんでしたが、今朝何か書こうと思いました。/非常に/すぐに問題が発生しました。以下の非常に基本的なコードは実行されません。

 #include <stdlib.h>
 #include <stdio.h>
 int main(int argc, char* argv)
 {
        printf("arg is %s \n", argv[1]);
 }

次のエラーが表示されます

gcc dink.c -o dink
dink.c: In function ‘main’:
dink.c:6:2: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has  type ‘int’ [-Wformat]
./dink menkmenk
make: *** [all] Segmentation fault (core dumped)

どうしたの?

編集: コードが機能しない理由について回答を得ていますが、コンパイラが 2 番目の引数に int を保持していると考える理由を知りたいです。

4

4 に答える 4

5

他の回答は、問題を解決する方法を示しています。その特定のエラー メッセージが表示された理由は次のとおりです。

C には、式の型を変更するための規則があります。ほとんどの場合、それらは自動的に他の型に変換されます。私が通った大学のクラスでは、これらのコンバージョンは非公式に「プロモーション」と呼ばれていましたが、正しい専門用語は「コンバージョン」であると思います (以下の @Steve Jessop からのコメントを参照)。

次に例を示します。

float f = 3.14f + 2;

この例では、float に整数を追加するように要求しています。C 型の規則に従って、整数値は float に変換され (標準で文書化されている「通常の自動変換」の一部として)、次に 2 つの float が加算され、入力した場合と同じ結果が得られます。

float f = 3.14f + 2.0f;

ところで、接尾辞を取り除けば、さらに多くの変換が行われることになりfます。次の式を検討してください。

float f = 3.14 + 2;

3.14接尾辞を付けて宣言されていないためf、 型の定数ですdouble。次に、整数2が に変換されdouble、加算が行われ、結果は になりdoubleます。ただし、 からにfloat変換されるように、型の変数に割り当てる必要があります。おそらく、 から に変換するときに精度が失われる可能性があるというコンパイラの警告が表示されます。doublefloatdoublefloat

とにかく、あなたの質問に戻ります:

argvtype として宣言してchar *から を参照するargv[1]と、式の型はargv[1]typeでしたchar。しかし、C は型を からcharに変換したintため、紛らわしいエラー メッセージが表示されました。

C の型変換規則の詳細については、次を参照してください。

http://www.eskimo.com/~scs/cclass/int/sx4cb.html

編集:@Steve Jessopからのコメントに応じて、「プロモーション」ではなく「コンバージョン」という言葉を一貫して使用するように上記を変更しました。

于 2013-05-27T18:17:40.727 に答える
3

試す、

int main(int argc, char** argv)

また

int main(int argc, char* argv[])
于 2013-05-27T18:04:59.617 に答える
2

あなたの署名mainが間違っています。 argv文字列の配列でなければなりません。すなわち

int main(int argc, char* argv[])
//                           ^^
于 2013-05-27T18:03:19.803 に答える
1

char **argvorとして argv を宣言する方がより一般的char *argv[]です。

char *argvargv が a へのポインターであることを示しますがchar、これはかなり異なります。

したがって

int main(int argc, char **argv)

また

int main(int argc, char *argv[])

あなたが期待するものとより一致するはずです。

また、そのように要求することは好ましくありませんargv[1]。一般に、少なくともそのような引数があることを確認する必要があります。

于 2013-05-27T18:08:57.833 に答える