0

C で次のコマンドを使用して、(64 ビット システムで) 80 バイトを d に割り当てます。

double *d = calloc(10, sizeof(double));

そして、次のループを使用してdを初期化します

for (k=0;k<11;k++){
d[k] = k;
}

プログラムを実行すると、エラーは発生しません。が上限なので、d は長さ 10 の配列なので何か問題があると思います。プログラムがエラーなしで実行される理由を教えてくださいk11前もって感謝します。

4

2 に答える 2

8

これは未定義の動作です。エラーが発生する可能性があり、ルールを破ると、OS によって黙って無視される可能性があります。すべての賭けは無効になります。

コードで実際に何が起こるかは、OS、コンパイラ、およびそれを実行するアーキテクチャによって異なります。これらは、この違反、クラッシュ、または何か他のことを許容する可能性があります。ポイントは、結果の動作が未定義であることです。

于 2013-02-02T07:23:41.803 に答える
0

C と C++ は、プログラム スタック内にある限り、配列とポインターの境界チェックを行わないと思います。アクセスがプログラムスタックの外にある場合、セグメンテーション違反がスローされると思います。

于 2013-02-02T07:27:29.490 に答える