こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

行列に関するプログラムです。
ライブラリのヘッダファイル 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);とでは表示される値が違い、理由がわからず困っています。
どうか回答をよろしくお願いします。

投稿日時 - 2009-07-18 18:55:05

QNo.5135867

困ってます

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

>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)

投稿日時 - 2009-07-18 20:34:18

お礼

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

投稿日時 - 2009-07-19 17:44:19

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

#1&#2ですが

MATRIX zero_matrix(MATRIX a) /*零行列をつくる*/

をみてみると、そもそもポインタが全く理解できていませんね。
質問以前にもう少し勉強しましょう。

投稿日時 - 2009-07-18 20:33:59

ANo.2

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

printf("b[1,1]の値:%lf\n",*a.elements);
だよね

投稿日時 - 2009-07-18 20:18:16

ANo.1

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

投稿日時 - 2009-07-18 20:11:05

補足

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

投稿日時 - 2009-07-19 17:44:52

あなたにオススメの質問