重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

構造体の配列を関数の引数として渡そうとすると
エラーになってしまいます
ネットで調べてもいまいちわからなかったので
ここで質問させてもらいます

#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){
    ・
    ・
   ・
}

どうすれば渡すことができるのでしょうか?
どなたか助言お願いします。

A 回答 (5件)

> 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つの構造体のポインタなのか知るすべはありませんので
扱いに注意が必要です。
    • good
    • 0

すみません。

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

一応、
void func(struct A p[][]);
はコンパイラは通ることは通るけれど、サイズが不定なので、func内部で要素にアクセスするのは無理か。せめて p[][4] にしないと。
    • good
    • 0

 


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

自信はないですが。


ええと、コンパイルエラーになるのでしょうか?

func(x);
の引数の型が合っていないような感じがします。
これだと、
void func(struct A **p);
のような・・・。
    • good
    • 0

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

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!