- ベストアンサー
関数とポインタについて
#include <stdio.h> void test(int *p); int main() { int i; test(&i); printf("%d",i); return 0; } void test( int *p) { static int k; k = 10; p = &k; } このようなプログラムを作って、void test()のkの値をmain関数で受け取りたいのですが、どのようにすればよいのかわかりません。 どなたか教えていただけませんか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
★最終的に何がしたいのでしょうか? ・『in_file_stu_test』関数で構造体を呼び出し元に返したいようですが、 (1)静的な構造体配列を返したい。 (2)動的な構造体配列を返したい。 どちらでしょうか? 質問・補足を読む限りでは(1)ですが本当にこちらですか? ※良く分かりませんので2つサンプルを載せておきます。 // サンプル1: int in_file_stu_test1( struct student **save ) { static struct student test[ CL ][ CL_MAX ]; *save = (struct student *)test; : 省略 : return 0; ←適当に } // サンプル2: int in_file_stu_test2( struct student **save ) { struct student *p; p = malloc( sizeof(struct student) * CL * CL_MAX ); if ( p == NULL ) return -1; *save = p; : 省略 : return 0; ←適当に } // 呼び出し int main( void ) { struct student (*test)[ CL_MAX ]; // サンプル1 in_file_stu_test1( &(struct student *)test ); printf( "stu_num = %d\n", test[0][0].stu_num ); printf( "stu_kan_m_name = %s\n", test[0][0].stu_kan_m_name ); printf( "stu_kan_1st_name = %s\n", test[0][0].stu_kan_1st_name ); printf( "stu_fu_m_name = %s\n", test[0][0].stu_fu_m_name ); printf( "stu_fu_1st_name = %s\n", test[0][0].stu_fu_1st_name ); // サンプル2 in_file_stu_test2( &(struct student *)test ); : 省略 : return 0; } サンプル1…静的な構造体配列を返す方法。 サンプル2…動的な構造体配列を返す方法。 呼び出し元…適切なキャストを行います。
その他の回答 (5)
- luckymako
- ベストアンサー率55% (29/52)
静的に確保された領域への参照を渡すだけなら 構造体でもなんらかわらないと思うのですが? 別に領域を確保して値をコピーする必要があるならそれなりに書かないといけないですね... gcc 3.4.4 で通りました↓ #include <stdio.h> typedef struct S{ int a[1][1]; } S; void test(S *p){ static S k; k.a[0][0] = 10; *p = k; } int main(){ S i; test(&i); printf("%d",i.a[0][0]); return 0; }
お礼
丁寧な説明ありがとうございます。
- Tacosan
- ベストアンサー率23% (3656/15482)
えっと.... 例えば int test[3][30]; int x; x = test; というコードがまともに動作すると思う?
補足
ご回答ありがとうございます。 そのコードがまともに動作しないというのは予想ができます。 私がしたいのは サブ関数の中で定義されて値が入れられた構造体を どのように呼び出し元に渡すのかというところです。 構造体ではなく、int型であれば、#1の方の回答でできることはわかりました。 しかし、同じように構造体でしたいのですが、構造体ではできないので 質問をしてます。 無理でしょうか?
- asuncion
- ベストアンサー率33% (2127/6289)
> 当該のコード全体を見せてください。 こう書いた理由は、お手持ちのコードと同じものを使って、 当方の環境でコンパイルエラーを再現させたかったからです。 今回提示されたコードは、構造体定義部分が欠落していて、不完全です。 当方の環境で、ご自身と同じコンパイルエラーを正確に再現することができません。 趣旨をご理解いただけるでしょうか。
お礼
補足の補足になります。 開発環境は、 Eclipse SDK 3.1 Eclipse CDT 3.0 Eclipse V3.0日本語パック を使用しております。
補足
失礼いたしました。構造体定義部分を掲載します。 struct student { int stu_num; //出席番号 char stu_kan_m_name[30]; //漢字苗字 char stu_kan_1st_name[30]; //漢字名前 char stu_fu_m_name[30]; //カタカナ苗字 char stu_fu_1st_name[30]; //カタカナ名前 }; このような定義になっております。 よろしくお願いいたします。
- asuncion
- ベストアンサー率33% (2127/6289)
> コンパイルエラー"incompatible types in assignment" 当該のコード全体を見せてください。
補足
int main() { printf("test\n"); int i; struct student student_test[3][30]; in_file_stu_test(student_test[0]); printf("%d",student_test[0][0].stu_num); printf("%s",student_test[0][0].stu_kan_m_name); return 0; } int in_file_stu_test(struct student *save) { static struct student test[CL][CL_MAX]; *save = test; test[0][0].stu_num = 1; strcpy(test[0][0].stu_kan_m_name , "宍戸"); strcpy(test[0][0].stu_kan_1st_name , "聡"); strcpy(test[0][0].stu_fu_m_name , "シシド"); strcpy(test[0][0].stu_fu_1st_name , "アキラ"); } イメージとしてはこんな感じです。 実際は、static struct student testは[3][30]の2次元配列になっています。
- asuncion
- ベストアンサー率33% (2127/6289)
> p = &k; *p = k;
お礼
ご回答ありがとうございます。
補足
ありがとうございます。 もし、int i やint k が構造体の場合 struct student i、 struct student p、 struct student k、 に書き換わった場合も同じように宣言すると、 コンパイルエラー"incompatible types in assignment" が出てしまうのですが、どのように回避すればよいでしょうか?
お礼
ありがとうございます! このサンプル1がわかりやすい例でした。 本当に助かりました!