[解決済み】なぜこのforループはあるプラットフォームでは終了し、他のプラットフォームでは終了しないのでしょうか?
質問
最近C言語を学び始め、C言語を題材とした授業を受講しています。現在、ループで遊んでいるのですが、どう説明したらいいのかわからない奇妙な動作に遭遇しています。
#include <stdio.h>
int main()
{
int array[10],i;
for (i = 0; i <=10 ; i++)
{
array[i]=0; /*code should never terminate*/
printf("test \n");
}
printf("%d \n", sizeof(array)/sizeof(int));
return 0;
}
Ubuntu 14.04を実行している私のノートパソコンでは、このコードは壊れません。完了まで実行されます。CentOS 6.6を実行している私の学校のコンピューターでも、問題なく実行されます。Windows 8.1では、ループは決して終了しません。
さらに不思議なのは、この条件を編集すると
for
にループさせる。
i <= 11
このコードは、Ubuntuを実行している私のラップトップ上でのみ終了します。CentOSやWindowsでは決して終了しません。
どなたか、メモリ内で何が起こっているのか、なぜ同じコードを異なるOSで実行すると異なる結果になるのか、説明していただけませんか?
EDIT: forループが範囲外になっているのは分かっています。意図的にやっているのです。ただ、OSやコンピュータの違いでどうして挙動が異なるのかがわからないのです。
解決方法は?
<ブロッククオートUbuntu 14.04が動作する私のノートパソコンでは、このコードは壊れず、完了まで実行されます。CentOS 6.6を実行している私の学校のコンピュータでも、正常に実行されます。Windows 8.1では、ループが終了することはありません。
さらに不思議なのは、このように条件指定を編集すると
for
にループさせる。
i <= 11
このコードは、Ubuntuを実行している私のラップトップ上でのみ終了します。CentOSとWindowsは決して終了しません。
メモリストンプを発見したんですね。 詳しくはこちらで解説しています。 メモリーストンプ」とは?
を割り当てたとき
int array[10],i;
これらの変数はメモリに入ります(具体的には、関数に関連付けられたメモリブロックであるスタックに割り当てられます)。
array[]
と
i
はメモリ上で隣接していると思われます。 Windows8.1ではそうなっているようです。
i
は
array[10]
. CentOSの場合。
i
は
array[11]
. そしてUbuntuでは、どちらの場所にもありません(もしかしたら
array[-1]
?).
これらのデバッグ用記述をあなたのコードに追加してみてください。 繰り返し10または11で気づくはずです。
array[i]
を指しています。
i
.
#include <stdio.h>
int main()
{
int array[10],i;
printf ("array: %p, &i: %p\n", array, &i);
printf ("i is offset %d from array\n", &i - array);
for (i = 0; i <=11 ; i++)
{
printf ("%d: Writing 0 to address %p\n", i, &array[i]);
array[i]=0; /*code should never terminate*/
}
return 0;
}
関連
-
[解決済み】「The breakpoint will not currently be hit」を改善するには?このドキュメントにはシンボルが読み込まれていません。" という警告はどうすれば改善されますか?
-
[解決済み】Valgrind が "Invalid write of size 8" で文句を言う。
-
[解決済み】「構造体でもユニオンでもないものにメンバー'*******'を要求する」とはどういう意味ですか?
-
[解決済み】Linuxでexeclp()がどのように動作するのか理解できません。
-
[解決済み] '{'トークンの前に期待される式
-
[解決済み】Linuxソケットのwrite()でBad File Descriptorが発生するC
-
[解決済み】配列型char[]が代入できない [重複]。
-
[解決済み] printfは、フォーマット文字列の中に改行がないと、呼び出し後にフラッシュしないのはなぜですか?
-
[解決済み] なぜsizeof(x++)はxをインクリメントしないのですか?
-
[解決済み] なぜこのループは「warning: iteration 3u invokes undefined behavior」を生成し、4行以上出力するのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】strcmpが機能しない
-
[解決済み] strtokのセグメンテーションフォールト
-
[解決済み】エラー:'for'ループの初期宣言はC99モードでしかできない【重複
-
[解決済み】デバッガgdbの使用時に不明な終了シグナルが発生する。
-
[解決済み】「無効なイニシャライザー」と表示されるのですが、何が間違っているのでしょうか?
-
[解決済み】 switch case: error: case label does not reduce to an integer constant
-
[解決済み】未定義参照 makefile が間違っているのかも?
-
[解決済み】エラー:呼び出されたオブジェクトは、関数または関数ポインタではない
-
[解決済み】.axfファイルとは何ですか?
-
[解決済み] なぜこのループは「warning: iteration 3u invokes undefined behavior」を生成し、4行以上出力するのでしょうか?