我有
int list[] = {1, 2, 3};
如何获得list
的大小?
我知道对于char数组,我们可以使用strlen(array)
来查找大小,或者在数组末尾使用'\0'
进行检查。
我尝试了sizeof(array) / sizeof(array[0])
,因为有些答案说,但它只适用于主?例如:
int size(int arr1[]){
return sizeof(arr1) / sizeof(arr1[0]);
}
int main() {
int list[] = {1, 2, 3};
int size1 = sizeof(list) / sizeof(list[0]); // ok
int size2 = size(list_1); // no
// size1 and size2 are not the same
}
为什么?
答案 0 :(得分:50)
试试这个:
sizeof(list) / sizeof(list[0]);
因为这个问题被标记为C ++,所以总是建议在C ++中使用std::vector
而不是使用传统的C风格数组。
将array-type
传递给函数时,pointer-type
会隐式转换为template<typename T,int N>
//template argument deduction
int size(T (&arr1)[N]) //Passing the array by reference
{
return sizeof(arr1)/sizeof(arr1[0]); //Correctly returns the size of 'list'
// or
return N; //Correctly returns the size too [cool trick ;-)]
}
。
看看this.
为了在任何函数内正确打印数组的大小,通过引用该函数传递数组(但你需要提前知道该数组的大小)。
对于一般情况
,你会这样做{{1}}
答案 1 :(得分:12)
“标准”C方式是
sizeof(list) / sizeof(list[0])
答案 2 :(得分:9)
您可以使用boost::size
,这基本上是这样定义的:
template <typename T, std::size_t N>
std::size_t size(T const (&)[N])
{
return N;
}
请注意,如果要将大小用作常量表达式,则必须使用sizeof a / sizeof a[0]
惯用法或等待下一版本的C ++标准。
答案 3 :(得分:8)
你不能为动态分配的数组(或指针)执行此操作。对于静态数组,您可以使用sizeof(array)
以字节为单位获取整个数组大小,并将其除以每个元素的大小:
#define COUNTOF(x) (sizeof(x)/sizeof(*x))
要获得动态数组的大小,您必须手动跟踪它并使用它传递它,或者使用sentinel值终止它(如空终止字符串中的'\ 0')。
更新:我意识到你的问题被标记为C ++而不是C.你应该考虑使用std::vector
代替C ++中的数组,如果你想传递一些东西:
std::vector<int> v;
v.push_back(1);
v.push_back(2);
std::cout << v.size() << std::endl; // prints 2
答案 4 :(得分:4)
除了Carl的回答,“标准”C ++方式不是使用C int
数组,而是使用C ++ STL std::vector<int> list
,可以查询list.size()
。< / p>
答案 5 :(得分:4)
由于您已将此标记为C ++,因此值得一提的是,有一种比C风格宏更好的方法:
template <class T, size_t N>
size_t countof(const T &array[N]) { return N; }
这样做的好处是,如果你不小心尝试将一个数组以外的东西传递给它,代码就不会编译(而传递一个指向C宏的指针会编译但会产生不好的结果。缺点是这不会给你一个编译时常量,所以你不能做这样的事情:
int a[20];
char x[countof(a)];
在C ++ 11或更高版本中,您可以添加constexpr
以获得编译时常量:
template <class T, size_t N>
constexpr size_t countof(const T &array[N]) { return N; }
如果你真的想在旧的编译器上支持同样的东西,有一种方法,最初是由Ivan Johnson,AFAIK发明的:
#define COUNTOF(x) ( \
0 * sizeof( reinterpret_cast<const ::Bad_arg_to_COUNTOF*>(x) ) + \
0 * sizeof( ::Bad_arg_to_COUNTOF::check_type((x), &(x)) ) + \
sizeof(x) / sizeof((x)[0]) )
class Bad_arg_to_COUNTOF
{
public:
class Is_pointer;
class Is_array {};
template<typename T>
static Is_pointer check_type(const T*, const T* const*);
static Is_array check_type(const void*, const void*);
};
这使用sizeof(x)/ sizeof(x [0])来计算大小,就像C宏一样,因此它给出了编译时常量。不同之处在于,如果您传递的内容不是数组的名称,它首先会使用一些模板魔法来导致编译错误。它通过重载check_type来返回指针的不完整类型,但是数组的完整类型。然后(真正棘手的部分)它实际上根本没有调用该函数 - 它只需要函数返回的类型的大小,对于返回完整类型的重载为零,但不允许(强制执行编译错误)为不完整类型。
IMO,这是模板元编程的一个非常酷的例子 - 虽然说实话,但结果却毫无意义。如果你正在使用数组,那么你真的只需要那个大小作为编译时常量,在任何情况下你都应该避免使用它。使用std::vector
,可以在运行时提供大小(并在需要时调整向量大小)。
答案 6 :(得分:1)
当你将任何数组传递给某个函数时。你只是传递它的起始地址,所以为了它的工作,你必须传递它的大小,以便它正常工作。这与我们在命令行争论中使用argv []传递argc的原因相同。
答案 7 :(得分:0)
你必须使用sizeof()函数。
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
int arr[] ={5, 3, 6, 7};
int size = sizeof(arr) / sizeof(arr[0]);
cout<<size<<endl;
return 0;
}
答案 8 :(得分:0)
int arr1[] = {8, 15, 3, 7};
int n = sizeof(arr1)/sizeof(arr1[0]);
所以基本上sizeof(arr1)给出了指向的对象的大小,每个元素可能占用多个位,所以除以每个元素的位数(sizeof(arr1 [0])给出实际的元素数量你正在寻找,即我的例子中的4个。
答案 9 :(得分:0)
您可以创建模板函数,并通过引用传递数组以实现此目的。
这是我的代码段
template <typename TypeOfData>
void PrintArray(TypeOfData &arrayOfType);
int main()
{
char charArray[] = "my name is";
int intArray[] = { 1,2,3,4,5,6 };
double doubleArray[] = { 1.1,2.2,3.3 };
PrintArray(charArray);
PrintArray(intArray);
PrintArray(doubleArray);
}
template <typename TypeOfData>
void PrintArray(TypeOfData &arrayOfType)
{
int elementsCount = sizeof(arrayOfType) / sizeof(arrayOfType[0]);
for (int i = 0; i < elementsCount; i++)
{
cout << "Value in elements at position " << i + 1 << " is " << arrayOfType[i] << endl;
}
}
答案 10 :(得分:0)
如果您想知道数组有多少个数字,就想知道数组的长度。 C语言中的sizeof(var)函数为您提供了计算机内存中的字节。因此,如果您知道int占用的内存,您可以这样做:
int arraylength(int array[]) {
return sizeof(array) / 4; // Size of the Array divided by the int size which is 4
}
答案 11 :(得分:0)
假设您只想知道其类型(int)但显然不知道其大小的数组的大小,则适合验证该数组是否为空,否则将得到以下结果除以零(导致Float point exception
)。
int array_size(int array[]) {
if(sizeof(array) == 0) {
return 0;
}
return sizeof(array)/sizeof(array[0]);
}