2012-01-11 3 views
1

私はC言語で引数を取得する方法を学んでいますが、以下のコードで以下のコードを実行すると、最初のコードはnullになります。Cの文字列がNULLになる

入力:./a.out a b c d e f g h i j k

出力:(null) b c d e f g h i j k

#include <stdio.h> 

    int main(int argc, char *argv[]) 
    { 
     int i = 2, j = 0; 
     char *foo = argv[1]; 
     char *bar[10]; 
     while(j < 10 && i < argc) 
     { 
      bar[j++] = argv[i++]; 
     } 
     bar[j] = NULL; 

     printf("%s ", foo); 
     for(j = 0; bar[j] != NULL; j++) 
     { 
      printf("%s ", bar[j]); 
     } 
     printf("\n"); 

     return 0; 
    } 
+1

質問がありますか? j == 10のときはb [10]に代入されますが、bはサイズが10でbの範囲を超えて割り当てられます。 –

+0

'"%s "'フォーマットでヌルポインタを渡す動作は定義されていません。あなたの実装は、 ''(null) ''を印刷するのに十分親切です。他の人が必ずしもそうするわけではありません。 –

+0

私の設定(ビジュアルスタジオ2010)では、うまくいきました。しかし、@WilliamPursellは正しいです、fooのアドレスはbarの直後かもしれないので、bar [10]はfooを指しています。 – holgac

答えて

5

あなたはbar[10]NULLを書くが、あなたがbar[0 - 9]のみを割り当てたループの終わりに。それはおそらくfooを上書きします。

+0

未定義の動作FTW。 –

+0

ありがとうございます。配列の終わりをNULLに設定しようとしていました。配列に11を割り当てる必要がありますか? – Lucas

+1

はい、最後にセンチネル値を置く場合、余分なスペースを割り当てる必要があります。 –

4

ループの最後にバー[10]をNULLに設定していますが、バー[9]までしか上がりません。 fooはスタックのbarの直後に割り当てられるので、bar [10] = NULLはfooを上書きします。

-1

プット(* ++ ARGV)(--argc)ながら

をお試しください。

関連する問題