- ベストアンサー
ポインタの指しているアドレスは同じなのに表示される内容が違う。
行列に関するプログラムです。 ライブラリのヘッダファイル 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);とでは表示される値が違い、理由がわからず困っています。 どうか回答をよろしくお願いします。
- みんなの回答 (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)
その他の回答 (3)
- prophetok
- ベストアンサー率44% (13/29)
#1ですが MATRIX zero_matrix(MATRIX a) /*零行列をつくる*/ をみてみると、そもそもポインタが全く理解できていませんね。 質問以前にもう少し勉強しましょう。
- prophetok
- ベストアンサー率44% (13/29)
#1は間違い やりたいことは printf("b[1,1]の値:%lf\n",a.elements); ↓ printf("b[1,1]の値:%lf\n",*a.elements); だよね
- prophetok
- ベストアンサー率44% (13/29)
ざっとみただけですか。 配列の添え字は0から始まるという基本中の基本を忘れていませんか?
補足
ここで言う配列とは、プログラムではなく数学的な添え字としていました。誤解を与えてしまったようです。
お礼
回答ありがとうございました。とても参考になりました。 メモリをまとめて確保することにはこれからしっかり気をつけて いきたいと思います。 本当にありがとうございました。