2016-12-04 24 views
0

私は以下のように入力としてトリプルポインタを取るAPIを持っています。 extern int myAPI(int *** myData);Cのポインタの配列へのポインタの配列

内部的には "myData"はポインタの配列へのポインタの配列として扱われます。

ここで別の関数では、私はこのmyAPIを呼び出す必要があります。しかし、私はポインタの配列へのポインタの配列を構築することができません。助けてもらえますか?

私は以下のコードスニペットと同様に試みました。しかし、タイプミスマッチコンパイルエラーが発生しました。

int i[10]; 
int j[10]; 
int *k[10]; 
int *l[10]; 
int *(*m[])[2]; 
int a = 0; 
for (a = 0; a < 10; a++) { 
    k[a] = &(i[a]); 
    l[a] = &(j[a]); 
} 

m[0] = k; 
m[1] = l; 

a = myAPI(m); 
+0

私はこの 'int *(* m [])[2];が疑問に思っています。初期化子なしで、不特定のサイズの配列を宣言しようとします。 – StoryTeller

+0

[時計回り/螺旋ルール](http://c-faq.com/decl/spiral.anderson.html)を忘れないでください。 – e0k

+0

'int myAPI(int *** myData);' 'int'のポインタへのポインタへのポインタを期待します。 – alk

答えて

2

あなたはすべてが、機能の引数の次元を指定する必要があります(だから、あなたは「intへのポインタ20の配列へのポインタの配列10」欲しい

int **m[2]; 
+0

これはポインタへのポインタの配列です。 OPは**配列**のポインタの配列を必要とします! – Olaf

+0

@Olaf: 'int ** m [something]'を 'myAPI(int *** myData);に渡すことは正しいでしょう。私が同意しても、関連する配列へのポインタはありません。 – alk

+0

@alk:配列が崩壊するので、頼まれたので、OPは何らかの理由で何か違うものを求めています。私が書いたように、これはOPが使うべきものではないかもしれない。 3(またはそれ以上)の星のポインタは、通常、悪いデスティネーションのインジケータです。 – Olaf

3

mの宣言を変更してみてください最も外側の次元のみを省略することができます)。だろう

int *(*a[10])[20]; 

このような構築物については、CDECLは非常に有用です。引用符で囲まれた行は、ツールの宣言です。

これは、の質問です。必ずしもあなたが本当に必要とするものではありません。多くの場合、そのような複雑な構造は深刻な設計上の欠陥の症状です。プログラムコードの再検討が必要な場合があります。