2008-09-08 19 views
15

nが次の機能で8と等しくないのはなぜですか?結果のサイズが異なる

void foo(char cvalue[8]) 
{ 
    int n = sizeof (cvalue); 
} 

しかしn機能のこのバージョンで8からが等しくない:あなたがCの関数のパラメータは、あなたが実際にポインタを渡しているとして全体配列を渡すことはできませんので

void bar() 
{ 
    char cvalue[8]; 
    int n = sizeof (cvalue); 
} 

答えて

45

それに;括弧は構文的な砂糖です。あなたが指している配列のサイズが8であるという保証はありません。あなたが望む任意の文字ポインタをこの関数に渡すことができるからです。最初の例で

// These all do the same thing 
void foo(char cvalue[8]) 
void foo(char cvalue[]) 
void foo(char *cvalue) 
+3

... –

1

、渡されたパラメータとしてcvalueは、文字配列には本当にただのポインタであり、あなたはそれのsizeof()を取るとき、あなたはポインタのサイズを取得します。 2番目のケースでは、ローカル変数として宣言していますが、配列全体のサイズが取得されます。

0

32ビットシステムでのパラメータのサイズは4であり、-m64でコンパイルされた64ビットシステムでのサイズは8になります。これは、配列が関数内でポインタとして渡されるためです。ポインタは単なるメモリアドレスです。

14

CおよびC++配列はファーストクラスのオブジェクトではありません。関数に配列を渡すことはできません。ポインタは常に崩壊します。

ただし、配列へのポインタと参照を渡すことはできます。これにより、配列の境界が崩れないようになります。だから、これは合法である:より多くの構文的なシアン化物のような

template<typename T, size_t N> 
void foo(const T(&arr)[N]) 
{ 
    int n = sizeof(arr); 
} 
+2

あなたはあなたの巧妙なソリューションのためのより多くのupmodsに値します。 –

+1

@NickRetallack agree – Ulterior

+0

テンプレートの例はCではなく、Cではなく、Cでは参照型をサポートしていないことに注意してください。 – Peter