next up previous contents
Next: 参照呼出しの場合 Up: 関数の引数、返り値としての構造体 Previous: 関数の引数、返り値としての構造体   Contents

値呼び出しの場合

値呼び出しの場合、構造体の値が関数内の自動変数にコピーされて参照されるので、 関数内部で構造体のメンバを修正しても、呼び出し側には基本的には影響は及ばない。 基本的と書いた理由は、メンバがポインタの場合には、少し事情が異なるからである。 例えば、先のパーソナルレコード2の名前の部分にあたるメンバをポインタに 変更したとする


struct psprec2 {
struct _birthday{
int yy;
int mm;
int dd;
} birthday;
char *name;
};

その上で、名前を記録するためのメモリを確保し 、 main関数内部でデータを与え、関数(func)に渡したとする。


#include ”psrec2.h”
#include <stdio.h>
void main(){
psrec2 student;
student.name = (char *)malloc(sizeof(char)*20);
strcpy(student.name, ”kojima”);
student.birthday.yy = 1968;
student.birthday.mm = 4;
student.birthday.dd = 6;
printf(”name before call func is %s \n”, student.name);
printf(”birthday before call func is %d %d %d \n”,
student.birthday.yy, student.birthday.mm, student.birthday.dd);
func(student);
printf(”name after call func is %s \n”, student.name);
printf(”birthday after call func is %d %d %d \n”,
student.birthday.yy, student.birthday.mm, student.birthday.dd);
}

その上で、関数内部で名前の一部分、誕生年を修正する。


void func(psrec2 student){
if( student.name != NULL ){
student.name[0] = ”K”;
}
student.birthday.yy = 1985;
}

すると、名前に対する修正はmainへ反映され、 誕生日の修正は反映されることなく、次のように画面に出力される。


name before call func is kojima
birthday before call func is 1968 4 6
name after call func is Kojima
birthday after call func is 1968 4 6



kojima hirohisa
2001-03-05