1

変数xを char ** として初期化することと、変数xを char * として初期化してから&を使用して参照することの違いは何ですか? この質問は、次の問い合わせから生まれました。

man 3 strtol関数を見ていました。関数のシグネチャは次のとおりです。

long strtol(const char *restrict str, char **restrict endptr, int base);

したがって、endptr変数を渡すために、変数をセットアップします。

char **endptr;

しかし、それを関数に渡すと、 strtolに渡されたstrがabcのようなものであった場合でも、常に NULL が返されました。いいえ:

         char ** endptr;
         long exitval = strtol(args[1], endptr, 10); /* try to get the val */
         if (endptr != NULL) { /* it wasn't a valid base-10 number */

しかし、endptr を次のように初期化する方法を変更したとき:

char *endptr;

endptr を&endptrとして関数に渡すと、 endptrが正しく設定されました。いいえ:

         char * endptr;
         long exitval = strtol(args[1], &endptr, 10); /* try to get the val */
         if (endptr != NULL) { /* it wasn't a valid base-10 number */

どちらの場合も、 char array の最初の char へのポインターへのポインターを渡していると思いましたが、一方のメソッドが機能し、もう一方のメソッドが機能しないという事実は、私の理解が間違っていることを示しています。

1 つの方法が機能し、もう 1 つの方法が機能しないのはなぜですか? 私は何を誤解していますか?

4

3 に答える 3

0

マニュアルページから:

endptr が NULL でない場合、strtol() は最初の無効な文字のアドレスを *endptr に格納します。

最初のケースでは、0 に初期化された の値を渡すためendptr、最初の無効な文字のアドレスは に格納されません。strtol()strtol()*endptr

endptr2 番目のケースでは、0 ではないtoのアドレスを渡すためstrtol()、無効な文字が見つかった場合でも NULL は返されません。

于 2013-04-21T15:51:30.113 に答える