我想知道为什么以下代码的输出是1和9.这是因为函数大小中未声明的数组?如何将“数组大小”分离为函数?
#include "stdafx.h"
#include <iostream>
using namespace std;
int size(int a[])
{
return sizeof a/sizeof a[0];
}
int main()
{
int a[] = {5,2,4,7,1,8,9,10,6};
cout << size(a) << endl;
cout << sizeof a/sizeof a[0] << endl;
system("pause");
return 0;
}
答案 0 :(得分:12)
当您编写size(a)
时,您传递的是指针,而不是数组。由于指针和int
的大小为4或8(取决于ABI),因此对于32位计算机而言,您获得sizeof(int *)/sizeof int
( 4/4 = 1 <和<强> 8/4 = 2 (对于64位) 1 或 2 。
在C ++中,当一个数组作为参数传递给一个函数时,实际上你正在传递一个指向数组的指针。
答案 1 :(得分:7)
Maroun85答案是对的。这并不明显,但a
中的int size(int a[])
是一个指针。
但是你为什么不用c ++的方式呢。使用std::vector
s
std::vector<int> a = {5,2,4,7,1,8,9,10,6};
cout << a.size() << endl;
这里没有技巧
- 编辑
如果您的编译器不支持c ++ 11。你可以这样做:
std::vector<int> a;
a.push(5);
a.push(2);
...
cout << a.size() << endl;
答案 2 :(得分:5)
您的size()
函数无法像您希望的那样工作,因为当您将数组传递给函数时,数组会衰减到指向其第一个元素的指针。您的a
衰减到指针上的int*
和sizeof运算符会返回指针的大小,而不是数组。请考虑使用std::vector<int>
,因为这样每次将其传递给函数时都可以检索向量的大小。
答案 3 :(得分:4)
将数组传递给函数时,它们会衰减为指针。因此,您的size()
函数等同于:
int size(int* a)
{
return sizeof a/sizeof a[0];
}
并且sizeof a
是指针的大小,这与此处的int的大小相同,因此是输出。
答案 4 :(得分:3)
请记住,数组总是由指针传递。
因此,在函数a
中是指向int
的指针,并且(对于32位整数)指向int
的指针的大小与{{1}的大小相同1}}。
答案 5 :(得分:3)
sizeof
在编译时进行评估,而不是在运行时进行评估。编译器不会分析您传递给函数size
的内容,而是将函数参数视为指针。因此,在您的函数size
中,sizeof a
的结果是{em>指针到int
的大小,这是偶然的,等于大小的int
您系统上的{{1}}。
答案 6 :(得分:3)
解决方案无效的最佳解释是Maroun的回答。
关于问题的第二部分(“怎么做?”),您可以使用模板函数执行此操作:
template <typename T, size_t n> const size_t size(const T (&)[n]) { return n; }
当然,这只适用于数组大小是常量的(常量,如编译器所见),但它只能在这种情况下工作 - 数组不会在任何地方存储它的大小,所以如果它不是一个已知的编译时常量,没有办法知道它。
如果您需要使用它来处理不编译时常量的数组(例如,您使用operator new[]
分配的内容,或使用非标准编译器扩展),则需要明确地将大小存储在某处。
(我在上面的陈述是技术上错误,实际上通常存储分配大小,但这是一个你不能也不应该依赖的实现细节。)