• ベストアンサー

ポインタの指しているアドレスは同じなのに表示される内容が違う。

行列に関するプログラムです。 ライブラリのヘッダファイル matrix.h #ifndef MATRIX_H #define MATRIX_H #ifdef __cplusplus extern "C"{ #endif typedef struct{ int row,col; double *elements; } MATRIX; extern int matrix_error_code; extern MATRIX zero_matrix(MATRIX a); extern MATRIX identity_matrix(MATRIX a); extern void func_matrix(MATRIX a); #ifdef __cplusplus } #endif #endif ライブラリのソースファイル matrix.c #include <stdio.h> #include <stdlib.h> #include <math.h> #include "matrix.h" int matrix_error_code = 0; MATRIX zero_matrix(MATRIX a) /*零行列をつくる*/ { int i,size; double *p; size=a.row*a.col; for(i=0;i<size;i++) { if((p = malloc(sizeof(double))) == NULL) { puts("メモリを確保できません."); exit(0); } *p=0; } a.elements=p-size; return a; } MATRIX identity_matrix(MATRIX a) /*単位行列をつくる*/ { int i; a=zero_matrix(a); for(i=0;i<a.row;i++) { *(a.elements+i*a.col+i)=1.0000; } return a; } void func_matrix(MATRIX a) { int i,j; double *p; printf("b.elementsの値:%p\n",a.elements); printf("b[1,1]の値:%lf\n",a.elements); } 動作確認用のアプリケーションファイル test_matrix.c #include <stdio.h> #include "matrix.h" int main(void) { int i,j; MATRIX b; b.row=2; b.col=2; b=identity_matrix(b); for(i=0;i<b.row;i++) { for(j=0;j<b.col;j++) { printf("%3.4lf ",*(b.elements+i*b.col+j)); } printf("\n"); } printf("\n\n"); printf("b.elementsの値:%p\n",b.elements); printf("b[1,1]の値:%lf\n",b.elements); func_matrix(b); return 0; } void func_matrix(MATRIX a)内のprintf("b.elementsの値:%p\n",a.elements);とtest_matrix.c内のprintf("b.elementsの値:%p\n",b.elements);で表示される値は同じなので、main関数のbがvoid func_matrix(MATRIX a)内のaに正しく引き渡されていると思うのですが、それぞれの次の行での、printf("b[1,1]の値:%lf\n",b.elements);とprintf("b[1,1]の値:%lf\n",a.elements);とでは表示される値が違い、理由がわからず困っています。 どうか回答をよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • trapezium
  • ベストアンサー率62% (276/442)
回答No.4

>for(i=0;i<size;i++) >{ >if((p = malloc(sizeof(double))) == NULL) >{ >puts("メモリを確保できません."); >exit(0); >} >*p=0; >} これではメモリリークしてます。 a.elements = p = malloc(sizeof(double) * size); if (NULL == p) exit(1); for (i = 0; i < size; i++) *p++ = 0.0; などとします。 それについでに言えば、 MATRIX hoge_matrix(MATRIX a) などは無駄なので、 void hoge_matrix(MATRIX *a) でいいと思う。呼び出し側はhoge_matrix(&b)

shuta1976
質問者

お礼

回答ありがとうございました。とても参考になりました。 メモリをまとめて確保することにはこれからしっかり気をつけて いきたいと思います。 本当にありがとうございました。

その他の回答 (3)

  • prophetok
  • ベストアンサー率44% (13/29)
回答No.3

#1&#2ですが MATRIX zero_matrix(MATRIX a) /*零行列をつくる*/ をみてみると、そもそもポインタが全く理解できていませんね。 質問以前にもう少し勉強しましょう。

  • prophetok
  • ベストアンサー率44% (13/29)
回答No.2

#1は間違い やりたいことは printf("b[1,1]の値:%lf\n",a.elements); ↓ printf("b[1,1]の値:%lf\n",*a.elements); だよね

  • prophetok
  • ベストアンサー率44% (13/29)
回答No.1

ざっとみただけですか。 配列の添え字は0から始まるという基本中の基本を忘れていませんか?

shuta1976
質問者

補足

ここで言う配列とは、プログラムではなく数学的な添え字としていました。誤解を与えてしまったようです。