知道论证有多大

时间:2013-01-26 11:43:51

标签: c++ pass-by-reference

假设我将一个参数传递给这样的函数:

void myFunc( int* arrayOfInts );

这个函数不知道整数数组的大小,这似乎并不安全。我可以发表评论说"这个函数假设它获得了10个整数的数组"但是无法检查它。因此错误使用此功能可能会导致神秘的“分段故障”#34;有更好的方法吗?

8 个答案:

答案 0 :(得分:3)

传递数组的大小,C风格:

void myFunc(int* arrayOfInts, int arraySize);

或者在数组结束后传入指针,迭代器样式:

void myFunc(int* begin, int* end);

或者传递std::vector<int>或同等版本并完全回避问题:

void myFunc(const std::vector<int>& vec);

答案 1 :(得分:2)

在C和C ++中,处理原始数组时,函数通常也需要传入数组的大小,例如

void foo(int *arr, size_t size_);

但是在C ++中,为什么不使用std::vector呢?这很安全。

答案 2 :(得分:2)

使用模板功能

template <int N>
void fmyFunc(int (& array)[N]) 
{ 
}

或STL容器(在现代C ++代码中更好的方式)

void fmyFunc(const std::vector<int>& v)
{
}

旧方法是传入数组大小

void fmyFunc(int* arrayOfInts, int size)
{
}

答案 3 :(得分:1)

您可以通过引用数组来获取参数,并使数组的大小为模板参数N

template <int N>
void myFunc(int (&arrayOfInts)[N])
{
    // here we know the size is N
}

或者,如果您的函数应该只接受特定大小的数组(例如,大小为3的数组的3D点),请指定该大小而不是使用模板。这样编译器只允许使用有效数组调用此函数:

void myFunc(int (&arrayOfExactlyThreeInts)[3])
{
}

答案 4 :(得分:1)

直截了可的C ++答案是使用std::vector

传统的C / C ++答案也是接受数组大小作为参数。

第三个答案,特别针对C ++:您可以使用专门用于数组大小的函数模板。 这并不意味着你应该。有关详细信息,请参阅c++ function template specialization for known size typedefed array上接受的答案。

答案 5 :(得分:0)

考虑使用指示大小的第二个参数,或者更好地使用std::vector<int>来查询函数内的大小

答案 6 :(得分:0)

要么传递大小,要么最好使用std::vector<int>

答案 7 :(得分:0)

正如其他人所说,添加一个带有数组大小的参数。这样做的原因是您可以为不同大小的数组编写一个函数。编写模板函数的方法可以计算出数组的大小,这意味着对于传递给模板的每个数组大小,您都有不同的函数。并且,是的,vector具有自己的大小,但增加了开销以便能够做到这一点。有时最简单是最好的。