2017-05-23 8 views
0

以下のコードを検討してください。これは、次の出力が生成されますC++スコープ?関数に配列を渡すときに問題が発生する

Length: 64 Testfn: 8 Length again: 64

私はトラブルtest -functionでの出力が主な機能での出力に等しくない理由を理解を持っています。 test -functionの出力が8に等しいことを考慮すると、sizeof(arg)が配列自体ではなくポインタのサイズを取得するため、これが原因であると想定します。

これはすべて私には非常に論理的と思われるが、なぜsizeofは、main関数内に同じ値を与えるものではありませんか?そして私はそれをどのように修正するのですか?逆参照でいくつかのことを試しましたが、これは何の違いもありません。

#include <iostream> 

void test(int arg[]) { 
    std::cout << "Testfn: " << sizeof(arg) << std::endl; 
} 

int main() { 
    int int_arr[16]; 
    std::cout << "Length: " << sizeof int_arr << std::endl; 
    test(int_arr); 
    std::cout << "Length again: " << sizeof int_arr << std::endl; 
} 
+2

そして、あなたは 'のstd :: vector'を引数(C)として長さを渡すか、または使用する必要がある理由、これは正確に/ 'std :: array'(C++)です。 – crashmstr

+0

はhttps://stackoverflow.com/questions/6567742/passing-an-array-as-an-argument-to-a-function-in-c、C++にも同様に適用されるを参照してください。 –

+0

469あなたは研究をしていませんでしたか? :/たとえば、この[質問](https://stackoverflow.com/questions/1975128/why-isnt-the-size-of-an-array-parameter-the-same-as-within-main)を確認してください。間違いを作るためにそれらを恥 – gsamaras

答えて

3

関数パラメータ

void test(int arg[]) { 

はint型へのポインタに調整されます。これは次の関数宣言です。

void test(int arg[16]); 
void test(int arg[]); 
void test(int *arg); 

は同等です。

だから関数内4または8

のいずれかに通常等しい使用してプラットフォームに依存宣言するする

void test(int (&arg)[16]) { 
    std::cout << "Testfn: " << sizeof(arg) << std::endl; 
} 

ようなC++関数を宣言することができsizeof(int *)が使用されパラメータを配列への参照として渡します。この場合、期待される結果が得られます。

+0

ありがとう!私はtest(intとarg [16])を使って試してみましたが、コンパイラはこれを受け入れなかったので、私はその可能性を完全に取り消しました。 9分で受け入れる – thepieterdc

1

あなたがC++11以降を使用している場合は、std::arrayは何が必要です:

#include <iostream> 
#include <array> 

template<size_t N> 
void test(const std::array<int, N>& arg) { 
    std::cout << "Testfn: " << arg.size() << std::endl; 
} 

int main() { 
    std::array<int, 16> int_arr; 
    std::cout << "Length: " << int_arr.size() << std::endl; 
    test(int_arr); 
    std::cout << "Length again: " << int_arr.size() << std::endl; 
} 
関連する問題