[c言語]関数の引数に構造体を渡す場合の注意(サンプルコードあり)
公開日 : / 更新日 :
構造体のポインタを関数の引数に取る場合
構造体のポインタを関数の引数に取る場合、関数内で構造体のメンバ変数に値を代入すると、関数を抜けた後も構造体のメンバ変数の値は保持されます。
関数実行の目的が、構造体のメンバ変数に値を代入することであれば、ポインタを関数の引数に渡してあげる必要があります。
下記がサンプルコードになります。
関数の実行前、関数内で値を代入後、関数の実行後で、構造体のメンバ変数をprintf出力しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
$ 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出力しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
$ 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 |