• ベストアンサー

関数とポインタについて

#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関数で受け取りたいのですが、どのようにすればよいのかわかりません。 どなたか教えていただけませんか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.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…動的な構造体配列を返す方法。 呼び出し元…適切なキャストを行います。

olive0817
質問者

お礼

ありがとうございます! このサンプル1がわかりやすい例でした。 本当に助かりました!

その他の回答 (5)

  • luckymako
  • ベストアンサー率55% (29/52)
回答No.5

静的に確保された領域への参照を渡すだけなら 構造体でもなんらかわらないと思うのですが? 別に領域を確保して値をコピーする必要があるならそれなりに書かないといけないですね... 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; }

olive0817
質問者

お礼

丁寧な説明ありがとうございます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

えっと.... 例えば int test[3][30]; int x; x = test; というコードがまともに動作すると思う?

olive0817
質問者

補足

ご回答ありがとうございます。 そのコードがまともに動作しないというのは予想ができます。 私がしたいのは サブ関数の中で定義されて値が入れられた構造体を どのように呼び出し元に渡すのかというところです。 構造体ではなく、int型であれば、#1の方の回答でできることはわかりました。 しかし、同じように構造体でしたいのですが、構造体ではできないので 質問をしてます。 無理でしょうか?

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

> 当該のコード全体を見せてください。 こう書いた理由は、お手持ちのコードと同じものを使って、 当方の環境でコンパイルエラーを再現させたかったからです。 今回提示されたコードは、構造体定義部分が欠落していて、不完全です。 当方の環境で、ご自身と同じコンパイルエラーを正確に再現することができません。 趣旨をご理解いただけるでしょうか。

olive0817
質問者

お礼

補足の補足になります。 開発環境は、 Eclipse SDK 3.1 Eclipse CDT 3.0 Eclipse V3.0日本語パック を使用しております。

olive0817
質問者

補足

失礼いたしました。構造体定義部分を掲載します。 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)
回答No.2

> コンパイルエラー"incompatible types in assignment" 当該のコード全体を見せてください。

olive0817
質問者

補足

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)
回答No.1

> p = &k; *p = k;

olive0817
質問者

お礼

ご回答ありがとうございます。

olive0817
質問者

補足

ありがとうございます。 もし、int i やint k が構造体の場合 struct student i、 struct student p、 struct student k、 に書き換わった場合も同じように宣言すると、 コンパイルエラー"incompatible types in assignment" が出てしまうのですが、どのように回避すればよいでしょうか?

関連するQ&A