2016-10-03 5 views
2

これは素朴な質問かもしれませんが、私の理解によると、配列の非可逆ベースインデックスはゼロで始まることが分かります。 私が理解していないのは、ベース1の索引付けを使用すると、次のプログラムが正常に動作する理由です。ベースインデックス1のCプログラムがうまくいきませんか?

#include<stdio.h> 
int main() 
{ 
    int n; 
    scanf("%d",&n); 
    int a[n]; 
    int i; 
    for(i=1;i<=n;i++) 
     scanf("%d",&a[i]); 
    printf("%d",a[n]); 
    return 0; 
} 
+4

あなたはただ幸運です –

+1

ほとんどのCプログラムと同様に、それは事故で動作します!初期化されていないメモリを見るには、最初の数字として '0'と入力してください。 – Ryan

+1

[未定義の動作](http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html) – purplepsycho

答えて

2

What I don't understand is that why the following program working fine

それはちょうど不運です。

これは未定義の動作です。つまり、コンパイラは警告する必要はなく、実行時にチェックするコードは生成されません。

未定義の作業を含む、完全に未定義を意味し、そしてあなたは顧客にそれを出荷するまで動作するように表示されるだけでなく、より多くの明白ながあなたのマシンをロック、すべてのディスクのフォーマットとに火を設定しますあなたのPSU

0

コードはコンパイルされますが、期待した結果が得られません。
配列aの最初の要素は印刷されず、cの配列のバインドチェックがないため、1つのガベージ値が配列の最後に出力されます。

+0

コードはコンパイルしないでください。 'int a [n]'は許されません。 C++では 'int * a = new int [n]'を実行できますが、Cではできません。 –

+2

C99 iircに可変長配列が追加されました。 – Useless

+2

@GraemePerrowそれは21世紀です。 –

関連する問題