如何找到int []的大小?

时间:2010-01-10 17:04:55

标签: c++ arrays

我有

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
}

为什么?

12 个答案:

答案 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]);
 }