0

まず、私は C プログラミングは初めてだと言わざるを得ません。私がやろうとしているのは、引数の入力を取り、それを整数に変換してからその値を返すプログラムを書くことです。私のコードは次のようになります。

#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[])
{
   int fromArgv = NULL;  /* holds value from argv[1] */
   fromArgv = atoi (argv[1]);    /* convert argv[1] to int */

   /* if incorrect no. of arguments entered */
   if (argc != 2) {
   fprintf (stderr, "error: wrong number of arguments\n");
   exit (EXIT_FAILURE);
   } 

   return fromArgv;
}

コンパイルしようとすると、次のエラーが発生します。

ex1.c: In function ‘main’:
ex1.c:6:18: error: initialization makes integer from pointer without a cast [-Werror]
cc1: all warnings being treated as errors
4

5 に答える 5

5

あなたの問題はラインです

int fromArgv = NULL; 

は通常、ポインターであるNULLとして定義されていると思います。(void *) 0このポインターをint変数に割り当てているため、エラーが発生します。

ただし、fromArgvこの場合は初期化する必要はありません。あなたはただ行うことができます:

int fromArgv;  /* holds value from argv[1] */
fromArgv = atoi (argv[1]);    /* convert argv[1] to int */

または単に

int fromArgv = atoi (argv[1]);    /* convert argv[1] to int */

argv[1]ただし、ユーザーがコマンドライン引数を入力しなくてもセグメンテーション違反が発生しないように、アクセスする前に存在することを確認する必要があります。if (argc != 2)の割り当ての前にテストを移動する必要がありますfromArgv

于 2012-11-03T17:49:31.813 に答える
3

NULLは nullポインタ定数 であり、それを整数値 ( )に代入しようとするとfromArgv、コンパイラは警告を報告します。

次の初期化は正常に機能します。

fromArgv = 0;

ただし、次の行で変数の値を変更しているため、役に立ちません。

int fromArgv = atoi(argv[1]);

ところで、この種の値を から返すのは悪い考えですmain(エラー コードに予約されていることがよくあります)。

于 2012-11-03T17:49:18.370 に答える
1

他の人が述べたように、「nullポインター」(型の観点からはポインター)で整数を初期化していますが、これは間違っています。ゼロに初期化したかったのですが、

       int fromArgv = 0;

次に、引数を選択し、引数の数をチェックする前ではなく、後でそれを intに変換する必要があります。そのため、パーツの後にある「atoi」行を移動する必要がありますif (argc != 2)

strtolの代わりに使用する可能性も考慮してくださいatoi。前者では、変換が成功したかどうかを確認できます。

于 2012-11-03T18:12:10.553 に答える
0

fromArgvを初期化する必要があるのはなぜですか?

ただ

int fromArgv = atoi(arg[1]);

正常に動作している必要があります

于 2012-11-03T18:00:23.893 に答える
0

NULL はポインターであり、それを int に割り当てているため、 fromArgv を NULL に初期化することはできません。行を int fromArgv として変更するだけです。

于 2012-11-03T17:54:30.217 に答える