0

だから、私はこのコードを持っています:

int randomNumber;
int max = 16;
int swap;
int table[16];

srand(time(NULL));
for (int i = 0; i < 16; ++i)
    table[i] = i + 1;

for (int i = 0; i < 16; ++i) {
    randomNumber = rand() % max;
    swap = table[max];
    table[max] = tablica_losowa[losuj];
    table[losuj] = swap;
    --max;
}

明らかに、問題はmax == 16のときに2番目のforループを最初に通過することにあり、table [max]にアクセスしようとしますが、コンパイルされて正常に実行されます。

これは、Objective-C、XCode 4.6、Apple LLVMコンパイラ4.2で記述されたiPad(最新のソフト)アプリケーションからのものです。

ヒントはありますか?

4

2 に答える 2

3

他の何かが所有するメモリ位置にアクセスしても、クラッシュが保証されるわけではなく、すべきでないことを行っていることが保証されるだけです。何が起こるかは、メモリの場所とその使用方法によって異なります。

コンパイラは、ここで問題を引き起こすために何もしていません。Objective C は C に基づいています... いくつかの点で少し厳密ですが、Cでは、構文が正しい限り、どんなに無効であっても多くのことを試みることができます。あなたの場合、テーブル [16]への書き込みは、重要ではないメモリ位置への書き込みである可能性があります。に書き込んでいる可能性がswapあり、上書きされます。組み立てを確認してください。

于 2013-03-15T11:11:27.353 に答える
0

問題は、C(およびObjective-C)が「未定義の動作」に関する保証を提供しないことです。配列の範囲外アクセスtable[16]は、そのような未定義の動作です(C11標準6.5.6を参照)。

未定義の振る舞いの場合のこの「保証を与えない」ことは非常に遠いです。そうすれば、プログラムは自由に何でもできます。ウェブカメラから写真を撮ってFacebookに投稿し、上司に不快なメールを送信してから、ハードドライブのフォーマットを開始することができます。可能性は低いですが、この動作は、言語が何をするかという点で完全に有効です。

したがって、エラーを無視してプログラムを実行し続けることも明らかに問題ありません。

于 2013-03-15T11:33:52.253 に答える