作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
大家好,我刚刚开始学习 C++,刚刚看了模板。我被要求制作一个模板函数打印,它将接受一个数组和一个 int 输入并打印出数组中的元素。这是我的代码。
#include <iostream>
using namespace std;
template <typename T>
void print(T a[], int b)
{
for(int y=0; y < b; y++)
{
cout << a[y] <<" ";
}
}
int main()
{
int arr[5];
int size = sizeof(arr);
for(int h=0; h<=size; h++)
{
arr[h]=0;
}
print(arr,size);
}
程序编译没有错误,但是当我运行它时却没有输出。谁能帮忙?或者指出正确的方向?
最佳答案
你的程序有 Undefined Behavior此时:
for (int h = 0; h <= size; h++)
{
arr[h] = 0;
}
您将 size
定义为数组 arr
中包含的字节数,而不是实际存在的整数数。因此,您平台上的整数很可能大于 1 个字节,因此 size
将等于远大于 5 的数字。
当您执行 arr[h]
时,您最终将访问数组范围之外的地址。正是在这一点上,您的程序发生了未定义行为的情况。在那一刻,您的程序中的任何事情都可能发生,包括输出不出现。
解决此问题的方法是将 arr
中存在的字节除以单个 int
的字节大小。这会告诉你元素的数量:
int size = sizeof(arr)/sizeof(int);
更好的解决方案是使用 std::array
这样大小是已知的,并且可以通过其成员函数 size
访问:
std::array<int, 5> arr{{}};
for (int i = 0; i < arr.size(); ++i)
arr[i] = 0;
注意使用aggregate-initialization在 std::array
上导致每个元素的零初始化。因此,后续的 for 循环没有用。
您还需要调整您的函数,以便它可以访问数组对象:
template<typename T, unsigned N>
void print(const std::array<T, N>& a)
{
for (const auto& x : a) // range-based for loop
{
std::cout << x;
}
}
关于C++ 泛型模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20019749/
我是一名优秀的程序员,十分优秀!