まず、質問が開いている間はバグを修正するためにコードを更新しないでください。現在の回答のほとんどが無意味になり、以前のコードで 1 つまたは複数の問題を解決した人によるクレジットが付与されず、自分自身に関連する問題を探しているカジュアルな読者が完全に混乱します。その中の質問と回答の両方によって。更新を修正したい場合は、元の問題に加えてそれを行いますが、それがまったく別の問題である場合は、回答済みとしてマークし、それが期限である場合は信用を与え、新しいコードと別の問題で新しい質問を開きます) (理想的にはとにかく)。
今書かれているように、あなたの機能は問題ありません。しかし、あなたの本当の問題はこれです:
// compile with -Wall -Werror and look at the warning here
int v={10,12,20,34,45}; // <== WRONG
getelements(&v,5); // <== Harmless, but bad form.
配列内のすべての要素を出力したい場合、これは次のようになります。
int v[] = {10,12,20,34,45};
getelements(v, sizeof(v)/sizeof(v[0]));
[]
次の配列に注意してください。&v
それがなければ、 はint
、int *
. さらに、エラーとして扱われる完全な警告 (gcc の場合) を使用して前のコードをコンパイルすると、宣言行-Wall -Werror
に次のようなエラーが表示されます。v
main.c:116:15: Excess elements in scalar initializer
言い換えれば、最初の要素以降はすべて無視されたため、ポインターは未定義の動作領域に飛び出していました。宣言と呼び出しを上記のものに変更すると、これに対処するだけでなく、配列またはポインター型でない限りコンパイルsizeof(v[0])
さえされないため、その間違いを繰り返さないようにすることができます。後者は、そのような計算で配列ではなくポインターを使用すると、依然として頭痛の種になる可能性がありますが、それは C で行うことに対して自分自身を訓練する必要があることです.v