请考虑以下代码。这会生成以下输出:
Length: 64
Testfn: 8
Length again: 64
我无法理解为什么test
- 函数的输出不等于main函数的输出。考虑到test
- 函数的输出等于8,我认为这是因为sizeof(arg)
得到指针的大小而不是数组本身。
这对我来说似乎都是合乎逻辑的,但为什么sizeof
在主函数中没有给出相同的值?我该如何解决?我已经尝试了一些解除引用的东西,但这似乎没有任何区别。
#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;
}
答案 0 :(得分:3)
功能参数
void test(int arg[]) {
调整为指向int类型的指针。这是以下函数声明
void test(int arg[16]);
void test(int arg[]);
void test(int *arg);
是等价的。
因此在函数内部使用sizeof( int * )
,取决于使用平台通常等于4或8。
您可以在C ++中声明该函数,如
void test(int ( &arg )[16]) {
std::cout << "Testfn: " << sizeof(arg) << std::endl;
}
即将参数声明为对数组的引用,在这种情况下,您将获得预期的结果。
答案 1 :(得分: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;
}