2012-01-04 23 views
0

のgcc 4.6.2 C89関数に2次元配列を渡す

は、私は関数に渡したい、次の2次元配列を持っている:

char elements[MAX_NUM_ELEMENTS][MAX_STRING_LEN] = {{0}}; 

私の関数のプロトタイプは次のとおりです。

int get_elements(char **elements) 

get_elements(elements); 

そして、私はこのような関数を呼び出しています210

はしかし、私は次のエラーを取得する:

expected ‘char **’ but argument is of type ‘char (*)[128]’ 

すべての配列は、なぜ私はポインタを渡すことはできませんので、必ず、ポインタにdeclay。あなたはキャストすることができます任意のアドバイスを

多くのおかげで、

+1

*すべての配列はポインタ*を宣言しません。いいえ、彼らはしません!配列は、配列である場合にのみ最初の要素へのポインタとして崩壊するだけで意味がありません。 –

答えて

1

あなたの関数に渡すオブジェクトは次のように定義されている場合:

char elements[MAX_NUM_ELEMENTS][MAX_STRING_LEN]; 

あなたの関数のプロトタイプはすべきではない:

int get_elements(char **elements) 

ではなく、むしろ:

int get_elements(char elements[][MAX_STRING_LEN]) 

または

int get_elements(char (*elements)[MAX_STRING_LEN]) 

(両方のフォームは等価である)

この理由は、タイプ

char [MAX_NUM_ELEMENTS][MAX_STRING_LEN]

のオブジェクトの値のタイプである

char (*)[MAX_STRING_LEN](の配列へのポインタでありますMAX_STRING_LEN chars)であり、char **(ポインタへのポインタはchar)ではありません。

1

は:

get_elements((char **) elements); 

char **char[128][128]は明らかに異なるタイプです。

1

プロトタイプが非常に壊れているように見えますが、タイプ名がありません。

「減衰した」ポインタを使用することはできません。これは、配列の次元に関する情報を失うため、アクセスを適切に計算するために(明らかに)必要です。

私の意見では、最初の要素にポインタを渡し、必要に応じて寸法を渡すことをお勧めします。 2Dの場合、これはどうしたら:

int get_elements(int *elements, size_t width, size_t height); 

また、これはあなたが決めることが必要、とに付着、のようなあなたの要素のためのインメモリレイアウト列優先または行優先。これは、特定の要素のアドレスを計算する方法に影響します。

+0

申し訳ありません、タイプ名を追加するのを忘れてしまいました。今修正されました。 – ant2009

1

「二次元配列とダブルポインタは同じではありません」「2 - 次元の配列はポインタの配列である」

配列とポインタ

について読みながら、私が学んだこと/記憶されています要素データがMAX_NUM_ELEMENTS * MAX_STRING_LEN -1 .. + 100から100に割り当てられたメモリを取得し、必要に

.. elements-データがメモリSTARTIN場所100 .. とポインタが場所50でメモリを持っている要素を持っていると言います100からのデータにアクセスします。

しかし

もし..あなたは...ダブルポインタとして要素を渡しているので、それは(> 100 50-)の位置にアクセスするのではなく、(50-> 100->実際のデータの)場所にアクセスしようとしますプロトタイプをint get_elements(char * element [])に変更します。これは動作します..

2

「ポインタへのすべての配列の崩壊は」このFAQで最初のいくつかの答えは、問題を明確C.

についてのよくある誤解です。