プロが教えるわが家の防犯対策術!

いかのようなプログラムをくんだのですが

#include<stdio.h>
int main(void)
{
int mark[5][3]={{80,90,75},{70,80,90},{90,90,100},{85,100,95},{55,65,70}};
int sum[8]={0};
int i,j;

for(i=0;i<=4;i++){
for(j=0;j<=2;j++)
sum[i]+=mark[i][j];}
printf("%d \n",mark[0][0]);

for(i=0;i<=4;i++){
for(j=0;j<=2;j++)
sum[i+5]+=mark[i][j];}

printf("%d ",mark[0][0]);

return 0;
}

このプログラムの実行結果は

80
360

となっていました。

ここで質問なのですがなぜmark[0][0]の値が80から360にかわってしまったのでしょうか?ずっと考えているのですが一向にわかりません。

A 回答 (1件)

sumは8個しか領域がないのに、sum[i+5]で10個分まで代入をしています。


結果、sum[8]の領域がmark[0][0]の領域と重なり、80に85+100+95が加算されています。
この領域の重なりは、main関数のmarkならびにsum変数が、スタック上に領域確保されることによります。
まあ、sum[i+5] への代入は、上記を意図したものでない限りbugですね。
因みに、mark[0][1]を表示すると、270になっているものと推測されます。これは、90+55+65+70です。
勿論、sumを10個確保すれば、この現象は起きません。
    • good
    • 2

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!