無限ループする原因について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
NaHCO3
記事: 3
登録日時: 11年前

無限ループする原因について

#1

投稿記事 by NaHCO3 » 11年前

こんばんは。初投稿ゆえ不備ございましたらご容赦ください。
自分で配列の初期化に失敗していた時に起きたことが
気がかりだったので投稿させて頂きます。

C言語の勉強をしていた時に誤って配列の添字を間違えた結果、
無限ループが起きました。無駄な部分を省いた書き方ではこんな感じです。

コード:

#include<stdio.h>

int main(void)
{
  int i = 0;
  int Array[100];
  
  for(i = 0; i =< 100; i++)
  {
      Array[i] = 1;
  }

  return 0;
}
お察しの通り、100用意した配列の要素に対して101回代入しようとしているため
バグが起きるのはわかったのですが、ここで無限ループしている理由がわかりません。

むしろ普通なら代入する要素が存在しないことがエラーで吐かれそうなものなのですが、
コンパイラも普通に通っているので更に疑問に感じました。
ちなみにコンパイラのバージョンはgcc 4.6.3です。
OSはUbuntuの12.04、VirtualBox上で動かしています。

お分かりの方いらっしゃったらご教授いただければ幸いです。
よろしくお願いいたします。

hide

Re: 無限ループする原因について

#2

投稿記事 by hide » 11年前

とりあえず、C言語ならば =< ではなく <= ではないですか?

C言語では配列の範囲外チェックをしないと記憶しています。
ですから、コンパイルエラーにはならないですね。Javaでもコンパイル時ではなく実行時に例外が飛んできます。

無限ループであると判断した要因がわからないのですが、
何をどう判断したのでしょうか?

かずま

Re: 無限ループする原因について

#3

投稿記事 by かずま » 11年前

NaHCO3 さんが書きました:ちなみにコンパイラのバージョンはgcc 4.6.3です。
OSはUbuntuの12.04、VirtualBox上で動かしています。
gcc 4.6.3 で次のプログラムを実行すると分かります。

コード:

#include<stdio.h>
 
int main(void)
{
  int i = 0;
  int Array[100];
  printf("&i=%p\n", &i);
  printf("&Array[100]=%p\n", &Array[100]);
  return 0;
}

NaHCO3
記事: 3
登録日時: 11年前

Re: 無限ループする原因について

#4

投稿記事 by NaHCO3 » 11年前

>> hide様

すいません、条件文の部分はコンソールからコピペが出来なかったのでそのまま直打ちで行っていた為に間違ったものです。
無限ループであると判断した要因なのですが、試しに変数iをprintfデバッグした時に
0~99までの出力を永遠と行っていることを確認したためです。

NaHCO3
記事: 3
登録日時: 11年前

Re: 無限ループする原因について

#5

投稿記事 by NaHCO3 » 11年前

>>かずま様

解決しましたありがとうございました。
無限ループの原因は配列の最後の要素であるArray[100]と変数iのアドレス値が同一だからですね。
なるほど、すっきりしました。
試しに配列を100で初期化するように書き換えたら処理が終わって笑いました。

お二方ありがとうございました。

naohiro19
記事: 256
登録日時: 14年前
住所: 愛知県

Re: 無限ループする原因について

#6

投稿記事 by naohiro19 » 11年前

C言語の配列は 宣言した数 - 1となります。

閉鎖

“C言語何でも質問掲示板” へ戻る