2016-10-08 36 views
1
#define N 10 

int main(int argc, char *argv[]) 
{ 
    int *a = malloc(sizeof(N)); 
    int i; 

    for(i = 1; i < argc; i++) { 
     *(a++) = atoi(argv[i]); 
    } 

    i = 0; 
    while(i < N) { 
     printf("%d ", *(a++)); 
     i++; 
    } 
} 

なぜ私の出力がすべて0であるのか混乱しています。私はコマンドラインの引数/ポインタを初めて使っているので、それを修正する方法はわかりません。このプログラムの背景は、整数をとり、atoiを使って文字列を整数に変換し、ポインタ算術を使って新しい配列を出力することです。コマンドライン引数の出力を修正して正しい整数を出力するにはどうすればよいですか?

+1

を供給する場合は、任意の4つの以上の引数を与える場合、これはセグメンテーションフォールトすべきセグメンテーションフォールトます

  • 愚かです。 'int * a = malloc(sizeof(int)* N)'または 'int * a = calloc(N、sizeof(int))' – Tibrogargan

  • +0

    ポインタをmallocするとインクリメントしません。配列構文を使用します。 –

    +0

    @Tibrogargan私が10の入力を入力したとき、私はseg faultを得ていませんでした。ただ0の出力 – EnglishStudent62

    答えて

    1

    これは非常に間違っています。

    sizeof(N)は整数定数(おそらく4バイト)のサイズを示します。つまり、malloc(N * sizeof(int))です。しかし、Nがmallであり、コンパイル時にそれを知っていれば、mallocを使うことはあまり意味がありません。 argc intをmallocしたい。シェルがこのような長い行を入力できると仮定して、プログラムは何百万ものコマンドライン引数に拡大します。

    次に、ポインタをmallocするとき、ポインタをハングアップする必要があります。それを増分しないでください。移動中のポインタが必要な場合は、aとptrという2つのポインタを使用します。 aはバッファを指し、 "所有している"、ptrは一時的に移動します。しかし、配列の構文a [i]は、ほとんどの場合、ポインタを移動するよりも望ましいものです。

    argcがNより小さい場合、最終的にはガベージ値が出力されます。これは、学習エクササイズ/探索プログラミングでは望めますが、通常達成したいとは思っていないかもしれません。

    1

    私の判断に反して、あなたの宿題に対する解決策があります。以下に注意してください:それはそれはmalloc関数の戻り値をテストしています

  • malloc関数の戻り値をキャストしていない

    • は、それはそれは、さまざまなを使用しています、それは
    • を割り当てたメモリを解放しています非NULL
    • ですポインタ演算
    • のそれは「ヨーダconditioを使用していARGC
    • の誤用を補正だ[0]
    • ARGVの使用を補正していますnは」可能性を排除するために、コンパイラは、それはまだあなたがどんな以上N引数
    #define N 10 
    int main(int argc, char *argv[]) 
    { 
        int *numbers; 
    
        if (NULL != (numbers = malloc(N * sizeof *numbers))) { 
         for(int i = 0; i < (argc - 1); i++) { 
          *(numbers + i) = atoi(argv[i + 1]); 
         } 
    
         for(int* a = numbers; a < (numbers + (argc - 1)); a++) { 
          printf("%d ", *(a)); 
         } 
         free(numbers); 
        } 
    } 
    
  • 関連する問題