2012-03-01 24 views
0

int配列のサイズを返す関数を書いています。ロジックは:sizeof(arr)/sizeof(int);変数に保存すると正常に機能しましたが、関数に返すと、サイズが10バイトの配列の場合は1になります。どうして?ここに私のコードは次のとおりです。同じ式ですが、関数で使用すると異なる戻り値

int b[10]; 
int t1= sizeof (b)/sizeof (int); 
size_t t2 = lenof(b); 
printf("t1 = %d, t2 = %d\n", t1, t2); 

size_t lenof (int arr[]) { return sizeof (arr)/sizeof (int); } 

上記のCコードを印刷:

t1 = 10, t2 = 1 

誰かが私のためにしてください説明することができますか?多分私はポインタを使用してそれを行う必要がありますか?ありがとう。

+0

ポインタを使用する必要があります。 'int att []'は実際にはint *、sizeはsizeof(int)と同じです。 – bmargulies

答えて

2

シナリオ1:この場合

int t1= sizeof (b)/sizeof (int); 

は、sizeof(b)intを正しく配列要素の数を与えるのサイズで割った配列のサイズを返します。

シナリオ2:
それはarray.Henceの最初の要素へのポインタとして減衰関数に配列を渡す場合、

lenof(int arr[]) 

が実際に正確に等しい:

lenof(int *arr) 

あなたのシステム上のポインタのサイズがsizeof (arr)であると、&のサイズはのサイズと同じですシステム上の、したがって除算と関数は1を返します。


Cでは配列の境界チェックが行われないため、配列境界を超えて書き込むと警告されません。これは本質的に配列を使用してwheileを意味します、配列の中にどれくらい多くの要素が存在しているかを追跡しなければなりません。

関数内で配列のサイズが必要な場合は、配列のサイズを別のパラメータとして渡すのが最も簡単な方法です。

lenof(int arr[], int len); 
+0

'T x []'パラメータの構文は、C++の他の機能よりも初心者が混乱していると思います。過去5分間でこれに関する2つの質問がありました。 –

+0

@SethCarnegie:確かに、それは 'C++ - Faq'や' C++ lounge-faq'の良い候補です。 –

+0

この質問はCではないC++ ... –

関連する問題