ページ 11

素朴な疑問です

Posted: 2011年8月05日(金) 17:29
by 虎ichi
はじめまして!
とある参考書にのってたおかしなプログラムについての質問です。
簡単な質問だと思いますが、よろしくお願いします。

コード:

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{

  int *a, *b;
  int i;

  a = (int*) calloc(100, sizeof(int));
  b = (int*) calloc(100, sizeof(int));

  for(i = 0; i < 300; i++)
    {
      a[i] = i;
    }
  for(i = 0; i < 100; i++)
    {
      printf("b[%d] = %d\n", i, b[i]);
    }
}
上記のプログラムを実行すると、何も初期化とかしていないのに配列bに
b[0] = 102
b[1] = 103
b[2] = 104



b[98] = 200
b[99] = 201
のように値が入っているのはなぜなのでしょうか?
free関数で開放してないからだけでしょうか?

Re: 素朴な疑問です

Posted: 2011年8月05日(金) 18:26
by bitter_fox
虎ichi さんが書きました:

コード:

  a = (int*) calloc(100, sizeof(int));
  b = (int*) calloc(100, sizeof(int));

  for(i = 0; i < 300; i++)
    {
      a[i] = i;
    }
上記のプログラムを実行すると、何も初期化とかしていないのに配列bに
b[0] = 102
b[1] = 103
b[2] = 104



b[98] = 200
b[99] = 201
のように値が入っているのはなぜなのでしょうか?
簡単に言うと一つ目のforでaの範囲を超えbの範囲まで代入しているせいです。

イメージで言うと次のような感じです。
1.png
1.png (4.27 KiB) 閲覧数: 1607 回

Re: 素朴な疑問です

Posted: 2011年8月05日(金) 18:32
by non
危険な(暴走する可能性の高い)プログラムなのでこのようなことは、しないように注意しましょう。
C言語はIndexの範囲をチェックしてくれませんからね。

Re: 素朴な疑問です

Posted: 2011年8月08日(月) 18:01
by 虎ichi
解決しました!ありがとうございます。