スポンサーリンク

構造体のポインタを関数の引数に取る場合

構造体のポインタを関数の引数に取る場合、関数内で構造体のメンバ変数に値を代入すると、関数を抜けた後も構造体のメンバ変数の値は保持されます。

関数実行の目的が、構造体のメンバ変数に値を代入することであれば、ポインタを関数の引数に渡してあげる必要があります。

下記がサンプルコードになります。
関数の実行前、関数内で値を代入後、関数の実行後で、構造体のメンバ変数をprintf出力しています。

 $ cat sample1.c 
#include <stdio.h>

typedef struct{
	int d1;
	int d2;
}data_t;

void func(data_t* pData){
	pData->d1 = 19;
	pData->d2 = 19;
	
	printf("d1=%d d2=%d\n", pData->d1, pData->d2);
}

int main(){
	data_t data;
	data_t* pData = &data;
	
	pData->d1 = 33;
	pData->d2 = 33;
	
	printf("d1=%d d2=%d\n", pData->d1, pData->d2);
	
	func(pData);
	
	printf("d1=%d d2=%d\n", pData->d1, pData->d2);

	return 0;
}

下記が実行結果になります。
関数実行後も値が保持されているのが確認できます。
 $ gcc sample1.c -o sample
 $ ./sample 
d1=33 d2=33
d1=19 d2=19
d1=19 d2=19

スポンサーリンク

構造体を関数の引数に取る場合

構造体を関数の引数に取る場合、関数内で構造体のメンバ変数に値を代入しても、引数で渡した構造体のメンバ変数に値は代入されません。
関数が実行されるときには、一旦構造体がコピーされて、コピーされた構造体の操作になるためです。

下記がサンプルコードになります。
先程と同様に、関数の実行前、関数内で値を代入後、関数の実行後で、構造体のメンバ変数をprintf出力しています。

 $ cat sample2.c 
#include <stdio.h>

typedef struct{
	int d1;
	int d2;
}data_t;

void func(data_t data){
	data.d1 = 19;
	data.d2 = 19;
	
	printf("d1=%d d2=%d\n", data.d1, data.d2);
}

int main(){
	data_t data;
	
	data.d1 = 33;
	data.d2 = 33;
	
	printf("d1=%d d2=%d\n", data.d1, data.d2);
	
	func(data);
	
	printf("d1=%d d2=%d\n", data.d1, data.d2);

	return 0;
}

下記が実行結果になります。
関数の実行後、関数内で代入した値は反映されていないことが確認できます。
 $ gcc sample2.c -o sample
 $ ./sample 
d1=33 d2=33
d1=19 d2=19
d1=33 d2=33

スポンサーリンク