函数参数中数组大小未指定
Unspecified size of array in function parameter
我无法理解,所以请帮助我。 Whrn 我们将数组传递给任何函数,然后在函数参数中编写数组类型来获取它,但为什么我们不在参数中初始化它的大小。
当然,您可以将数组的(固定)大小指定为函数参数 - 您必须通过引用传递数组。
void func(int (&x)[100]);
正在传递大小为 100 的 int 数组。
您甚至可以为其制作模板
template<class T, size_t N> void func(T (&x)[N]) {...}
在C++中,尽可能始终首选容器而不是原始指针或数组。
函数签名中的数组类型实际上是指针。 以下三个声明都是完全相同的:
void foo(int a[10]);
void foo(int a[]);
void foo(int* a);
在所有三种情况下,foo
都采用一个参数:指向int
的指针。 将数组传递给该函数时,它会隐式衰减到指向其第一个元素的指针。
当数组衰减为指针时,数组的长度将丢失。 这意味着将编译以下代码,但在逻辑上是错误的:
void foo(int a[10]) {
for (size_t i = 0; i < 10; ++i) {
std::cout << a[i] << 'n';
}
}
int main() {
// Whoops, wrong size array!
int arr[5] = {};
foo(arr);
}
现场演示
在这种情况下,长度声明是一个完全和彻头彻尾的谎言。 在函数定义中写入一个无意义的数字只会增加某人出错的风险。
如果必须对接受数组的函数参数使用原始指针,则函数还应接受大小参数:
void foo(int* a, size_t length) {
for (size_t i = 0; i < length; ++i) {
std::cout << a[i] << 'n';
}
}
int main() {
int arr[5] = {};
foo(arr, 5);
}
现场演示
不过,这也是危险的,因为完全有可能有人传递错误的大小并导致错误:
void foo(int* a, size_t length) {
for (size_t i = 0; i < length; ++i) {
std::cout << a[i] << 'n';
}
}
int main() {
int arr[5] = {};
//Whoops, passed the wrong size!
foo(arr, 10);
}
现场演示
因此,您应该首选使用容器:
void foo(const std::vector<int>& a) {
for (int i : a) {
std::cout << i << 'n';
}
}
int main() {
std::vector<int> arr(5);
foo(arr);
}
现场演示
如果您不知道要使用哪种类型的容器;默认为std::vector
。 如果您的函数必须支持多种类型的容器,请使用模板:
template <typename Container>
void foo(const Container& a) {
for (int i : a) {
std::cout << i << 'n';
}
}
int main() {
std::vector<int> arr(5);
foo(arr);
std::array<int, 5> arr2 = {};
foo(arr2);
}
现场演示
相关文章:
- 在C++中传递给函数时,为什么要指定数组大小作为参数
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 用数据填充未指定大小的数组
- 程序在初始化期间未与数组一起运行
- OpenMP 缩减为模板指定大小的数组C++会导致未定义的行为
- C++:如何使用静态常量变量指定数组长度
- 后来在结构类型(C )中指定数组大小
- 未调用数组的函数专用化
- C++初始值设定项中指定数组索引,如 C
- 缺少未声明数组元素的 nullptr
- 我需要动态地指定数组的大小
- 如果索引超过数组末尾有效,为什么我需要指定数组长度
- 由于大小可变,未创建数组
- 有没有办法在继承类的基类中指定数组的大小
- 布尔查找函数未在数组中搜索
- 如何清除堆上分配的未使用数组的整个内存
- 瓦尔格林德未显示数组复制错误
- 在参数中指定数组的大小有什么作用吗?
- 如何在运行时指定数组
- 在C++中指定数组声明中的元素位置