1. ホーム
  2. c

[解決済み】なぜこのforループはあるプラットフォームでは終了し、他のプラットフォームでは終了しないのでしょうか?

2022-04-03 02:18:40

質問

最近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ではそうなっているようです。 iarray[10] . CentOSの場合。 iarray[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; 
}