2016-05-04 4 views
2

私はJavaを使用しているC言語を使い慣れていません。私のCコードを実行するたびにセグメンテーションフォルトが返される

私は次のような些細なプログラムをコンパイルしましたが、ナノは実行するたびにセグメンテーションフォルトを投げます。そのポイントは、配列をたどり、各要素を別々の行に出力させることです。

int main() 
{ 
    int array[5] = {1, 2, 3, 4, 5}; 
    int i = 0; 
    for (i = 0; i < sizeof(array); i++) 
    { 
      puts(array[i]); 
    } 
} 

私は間違っていますか?

+1

コンパイラの警告を最大にしてください。このコードについての警告が表示されます。 –

+3

'sizeof'は、オブジェクトのサイズをバイト単位で返します。これは、配列の要素の数と同じではありません(要素のサイズが1バイトでない限り)。要素の数を取得するには、値を1つの配列要素のサイズで除算する必要があります。また、 'int'を' puts'に渡すことはできません。これは文字列、 'char *'を必要とします。 –

+0

これは有効でもありません。これをコンパイルすると、コンパイラーが誤って構成されていることを意味します。例えば、GCCの場合、Cコンパイラ 'gcc -std = c11 -pedantic-errors'として必ず使用してください。 – Lundin

答えて

8

最初に、putsは整数ではなくヌル終了文字列を取ります。次に、sizeof(array)が配列の合計バイト数であるため、配列内の要素数を調べるには、sizeof(array)/sizeof(array[0])を使用します。第3に、標準Cにはint main(void)を使用してください。これを試してみてください:

int main(void) 
{ 
    int array[5] = {1, 2, 3, 4, 5}; 
    int i = 0; 
    for (i = 0; i < sizeof(array)/sizeof(array[0]); i++) 
    { 
      printf("%d\n", array[i]); 
    } 
} 
+0

良い答えですが、マイナーなニックピックス、あなたは 'return 0'を忘れていました。そして、[Strange Things](http://stackoverflow.com/questions/36784470)以来、比較のどちらかの側で操作のまわりに括弧を入れるのは常に良い考えです。/bit-operation-と/ 36784515#36784515)が忘れられたときに発生することが知られています。 +1ですが。 – Serdalis

+3

@Serdalis:C99とC11では、実行が 'main()'の終わりに来ると、 'return 0;'に相当します。私はこれが好きではありませんが、C++ 98が決定したことに同意します(そしてその決定も好きではありません)ので、それは完全に公正ではありません。私は括弧が見つからないという関連する問題は見当たりません。人々がオペレータの優先順位のテーブルを漠然と熟知していることを期待することは不合理ではなく、混乱させるビット単位の操作はありません。 –

+0

@JonathanLefflerあなたが正しいです、私は 'return 0'ビットを認識しませんでした。おそらく私がC89をすべての人生で使わなければならなかったので、この新しいflam-flammeryは全く奇妙です。 – Serdalis

関連する問題