假设我将一个参数传递给这样的函数:
void myFunc( int* arrayOfInts );
这个函数不知道整数数组的大小,这似乎并不安全。我可以发表评论说"这个函数假设它获得了10个整数的数组"但是无法检查它。因此错误使用此功能可能会导致神秘的“分段故障”#34;有更好的方法吗?
答案 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
具有自己的大小,但增加了开销以便能够做到这一点。有时最简单是最好的。