ページ 11

関数の呼び出し?

Posted: 2011年4月24日(日) 16:06
by タマ
windows visual studio 2008です。
配列d[]、fix[]を初期化して、各10個ずつprintfで表示しようとすると、
デバッグする時に停止してしまいます。どこに不具合を起こす箇所があるんでしょうか?

コード:

#include <stdio.h>
#include <stdlib.h>

#define MAXLENGTH 10

int *d, *fix;

void init_array(void){
/*配列d[]、fix[]の初期化*/
	for(int start=0;start<MAXLENGTH;start++){
		d[start]=0;
		fix[start]=0;
	}
}

int main(void){
             int i;
			 init_array();
             for(i=0;i<MAXLENGTH;i++){
                          printf("d[%d]=%d\n",i,d[i]);
                          printf("fix[%d]=%d\n",i,fix[i]);
			 }
	 return 0;
}

Re: 関数の呼び出し?

Posted: 2011年4月24日(日) 16:10
by たかぎ
ポインタdとfixが未初期化です。

Re: 関数の呼び出し?

Posted: 2011年4月24日(日) 16:22
by タマ
init_arrayに配列の初期化の役割を持たせる場合は、
d[start]=0;
fix[start]=0;
の0を変えた方がいいですか?

Re: 関数の呼び出し?

Posted: 2011年4月24日(日) 16:29
by たかぎ
タマ さんが書きました:init_arrayに配列の初期化の役割を持たせる場合は、
d[start]=0;
fix[start]=0;
の0を変えた方がいいですか?
そうではなくて、dもfixも、どのオブジェクトも参照していませんね。

例えていうなら、「5ページ目を読んでください」といっているけれども、一体どの本の5ページ目なのかを指示していないのと同じことです。

Re: 関数の呼び出し?

Posted: 2011年4月24日(日) 16:56
by softya(ソフト屋)
たかぎ さんが書きました:
タマ さんが書きました:init_arrayに配列の初期化の役割を持たせる場合は、
d[start]=0;
fix[start]=0;
の0を変えた方がいいですか?
そうではなくて、dもfixも、どのオブジェクトも参照していませんね。

例えていうなら、「5ページ目を読んでください」といっているけれども、一体どの本の5ページ目なのかを指示していないのと同じことです。
補足して書くと、int *d, *fix;の2つのポインタは何処の実体も指していないので、例えるならクラスメイトに「この本の0ページから10ページを読んでって言われたので、手を見たら手には本を持っていない」と言う電波的な状況なんです。そう言われてもあなたはどの本を見て良いのか分かりませんよね?それは、CPUも同じです。

Re: 関数の呼び出し?

Posted: 2011年4月24日(日) 17:07
by タマ
int *d,*fix;
の部分を
int d[MAXLENGTH],fix[MAXLENGTH];
にしたら正常に実行されるようになりました。
数を決めておくことで実体が現れたって事ですか?

Re: 関数の呼び出し?

Posted: 2011年4月24日(日) 17:21
by softya(ソフト屋)
int *d,*fix;はポインタで実体=物=オブジェクト=本ではありません。
int d[MAXLENGTH],fix[MAXLENGTH];は配列で実体=物=オブジェクト=本です。
厳密に言えば上のdと下のdは厳密には同じものではありませんが、ポインタには実体が別に必要だと理解してもらえば良いです。

コード:

int d_hontai[MAXLENGTH],fix_hontai[MAXLENGTH];
int *d = d_hontai,*fix = fix_hontai;
と書けばdとfixは実体を指しますので問題なく使えます。

Re: 関数の呼び出し?

Posted: 2011年4月24日(日) 23:45
by タマ
丁寧にありがとうございます。また一つ賢くなれました。