2016-07-17 6 views
1

Java/C++開発者はこちら。 Cを学ぼうとしていますが、私は配列のメモリ割り当てと混同しています。C - 配列は範囲外で使用できますか?

ここで何が起こっているか

#include <stdlib.h> 
#include <stdio.h> 
#include <windows.h> 

int main() 
{ 
    int az[3]; 
    az[2] = 66; 
    az[8] = 5214; 

    printf("%d\n", az[8]); 

    system("pause"); 
    return 0; 
} 

出力

5214 

どのようにそれをすることができますか?なぜ私はの外に出る例外またはプログラムがクラッシュするのですか?私はこれを無限に行うことができますか?この場合、配列の長さはどれくらいですか?私の配列ですでに値を範囲外に置くことができる場合は、malloc経由でメモリを割り当てるのは何ですか?これは私には意味をなさない。

enter image description here

+0

Cは範囲外については不平を言っていません。そのような単純な。 – icbytes

+1

振る舞いは「未定義」であり、まさにそれを意味します。クラッシュする可能性があります。ゴミを印刷できました。 sigsegvできました。 minecraftのコピーを起動することができます。 C/C++にはガードレールはありません。 – evaitl

+1

あなたはC++でも同じことができます。 Cまたはmallocに固有のものではありません。 – qexyn

答えて

4

Cは、任意の境界のチェックを実行しません。索引8で長さ3の配列を索引付けすると、プログラムで使用されている他のメモリーを微妙に破損させたり、メモリー内にその配列がどのように配置されているかによって即座にセグメンテーション違反が発生する可能性があります。

このタイプのエラーは「バッファオーバーフロー」と呼ばれる可能性があり、インデックスを作成する前に配列の境界をチェックしないと、実行時にプログラムが悪意のある変更を受ける可能性があるため、

Cコードの狂ったエキサイティングな世界へようこそ!

関連する問題