構造体のポインタを関数の引数に取る場合
構造体のポインタを関数の引数に取る場合、関数内で構造体のメンバ変数に値を代入すると、関数を抜けた後も構造体のメンバ変数の値は保持されます。
関数実行の目的が、構造体のメンバ変数に値を代入することであれば、ポインタを関数の引数に渡してあげる必要があります。
下記がサンプルコードになります。
関数の実行前、関数内で値を代入後、関数の実行後で、構造体のメンバ変数を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
