• ベストアンサー

構造体の配列を関数に渡すには

構造体の配列を関数の引数として渡そうとすると エラーになってしまいます ネットで調べてもいまいちわからなかったので ここで質問させてもらいます #include<stdio.h> struct A{   ・    ・    ・ }; void func(struct A *p); int main(void) { struct A x[3][4] = {     ・     ・     ・ }; func(x); return 0; } void func(struct A *p){     ・     ・    ・ } どうすれば渡すことができるのでしょうか? どなたか助言お願いします。

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

  • ベストアンサー
  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.4

> void func(struct A **p); 型が違いますのでおそらく最近のコンパイラでは コンパイルエラーになると思います。 >> struct A x[3][4] xの型は struct A[3][4]型です。 正しい引数としては、 「void func( struct A[3][4] x )」 となります。 ここで配列の最初の要素を不定数にしたい場合は、 No3さんの「void func(struct A p[][4])」を使うか、 「void func( struct A (*p)[4] )」とする必要があります。 >void func(struct A *p) 多少強引ですが、先頭のポインタ自体は渡されるので、 キャストして呼び出しを行っても動くでしょう。 但し、呼び出された関数内では渡された構造体が、 2次元配列なのか、N次元配列なのか、 1つの構造体のポインタなのか知るすべはありませんので 扱いに注意が必要です。

その他の回答 (4)

noname#130082
noname#130082
回答No.5

すみません。No.4さんの言うとおり、多次元配列では >> void func(struct A **p); >型が違いますのでおそらく最近のコンパイラでは >コンパイルエラーになると思います。 ではコンパイラが通りませんね。 記憶に頼って回答などするから、こういう馬鹿をする<(__)>。 MinGW入れて、gccで念のため確かめました。 一応、 void func(struct A p[][]); はコンパイラは通ることは通るけれど、サイズが不定なので、func内部で要素にアクセスするのは無理か。せめて p[][4] にしないと。

回答No.3

  関数の宣言、定義を void func(struct A p[][4]) とするか、 関数の呼び出しを func((strunct A *)x); とする。  

noname#130082
noname#130082
回答No.2

自信はないですが。 ええと、コンパイルエラーになるのでしょうか? func(x); の引数の型が合っていないような感じがします。 これだと、 void func(struct A **p); のような・・・。

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

「構造体の配列」じゃなくて, 例えば「int 型の配列」ならちゃんと渡すことができる?

関連するQ&A

専門家に質問してみよう