2016-07-06 19 views
-1
char a[255]; 
void test(char* a){ 
    printf("%d %d %d \n",sizeof(a),sizeof(*a),sizeof(&a)); 
} 

これらのすべては、変数 'a'の実際のサイズを取得しません。関数(言語c)でchar配列のサイズを取得するにはどうすればよいですか?

+1

他の関数に渡されると、配列はポインタに崩壊します。宣言のスコープ内でのみサイズを取得できます(ローカル配列の場合は関数スコープ、グローバル配列の場合はファイルスコープ)。 –

+0

strlen(a);配列全体ではなく文字列のサイズを返します –

+0

[sizeof(配列を指すポインタ)の検索方法](http://stackoverflow.com/questions/492384/how-to-find -the- sizeofa-pointer-to-an-array)を使用します。 – Lundin

答えて

3

できません。追加パラメータとしてサイズを渡す必要があります。大きさはおそらく負ではないため、おそらくタイプunsigned intです。

void test(char* a, unsigned int size) 
{ 
    // ... 
} 

それは同じ結果だが、それが慣例だから、あなたの第二引数size_tを作るためにも良いだろう。

void test(char* a, size_t size) 
{ 
    // ... 
} 
+4

あるいは 'size_t'は、オブジェクトシーケンスの大きさを記述するために標準ライブラリ全体でかなり使用されています。 – WhozCraig

+0

@WhozCraigよろしくお願いします。 – nvoigt

3

最初の要素へのポインタとともに明示的に渡す必要があります。

char a[255]; 
void test(char* a, size_t num_elem){ 
    /* do smth */ 
} 

int main() { 
    test(a, sizeof a/sizeof a[0]); 
    return 0; 
} 

そしてsizeof a/sizeof a[0]はあなたに、配列内の要素の数を示しますが、このトリックは、ポインタではなく配列のみで正しく動作しないことに注意してください。

+0

'sizeof a [size] a [0] 'トリックは、' a'は配列型であるのに対し 'test'では動作しないので、' main'関数でのみ機能します。 a 'は、ポインタ型であるパラメータ「a」によってシャドーイングされる。 – majk

+0

はい、そのトリックは配列にのみ適用され、ポインタには適用されません。 – Sergio

+1

これまでのところ、それは両方の場所で「動作」しますが、一旦ポインタの型に変換されると(パラメータの場合など)、それはあなたが望むように「動作」しません。このような場合は、両方のケースがエラーや警告なしにコンパイルされるため、多くのエンジニアの悩みになっています。 – WhozCraig

0

これはできません。 aのタイプはchar*であり、関連するサイズはありません。このため、バッファに出力する標準のライブラリメソッドのほとんどに、バッファサイズを指定するための余分なパラメータがあります(strncpy参照)。

関連する問題