确定C数组中的元素数量

时间:2011-10-13 15:18:11

标签: c++ arrays

调用print_array时,int array []参数(count)的大小不是预期的大小。似乎sizeof 返回整个数组的大小,即5 * sizeof(int)= 20。

namespace Util
{
   void print_array(int array[])
   {
      size_t count = (sizeof array)/(sizeof array[0]);
      cout << count;
      // int count = sizeof(array)/sizeof(array[0]);
      // for (int i = 0; i <= count; i++) cout << array[i];
   }
}


int array_test[5]={2,1,5,4,3};
Util::print_array(array_test);

8 个答案:

答案 0 :(得分:8)

int array[]此处变为int* arraysizeof(array)返回相同的内容sizeof(int*)。您需要通过引用传递数组以避免这种情况。

template <size_t N>
void print_array(int (&array)[N]) {
    std::cout << N;
}

int array[] = { 2, 1, 5, 4, 3 };
print_array(array);

答案 1 :(得分:2)

阅读本文:它说明了修复此问题的方法,但需要快速说明:

When a function has a specific-size array parameter, why is it replaced with a pointer?

使用sizeof(数组)将在数组静态定义的范围内工作。当您将其传递给函数时,类型将转换为指向数组元素类型的指针。在你的情况下,当你在print_array时它是一个int *。因此,函数中的sizeof将是系统上指针的大小(可能是32位或64位)。

你可以用一些像这样的花哨语法来解决这个问题(来自上面的链接):

  

如果你想保留数组类型,你应该传入一个   对数组的引用:

void foo ( int(&array)[5] );

但我要说的只是传递大小以及其他参数,它更具可读性。

答案 2 :(得分:1)

由于此数组实现为指针上的精简覆盖,因此您拥有的变量只是一个指针,因此sizeof将返回指针的大小。

知道数组长度的唯一方法是放置一个终止对象,作为C字符串中的空字符。

如果只有一个指向它的指针,则没有其他方法可以确定数组的大小。

答案 3 :(得分:1)

这是一个技巧:您可以将引用带到固定大小的数组中。您可以使用它来模板推断尺寸。

#include <iostream>

char a [22];
char b [33];

void foo (char *, size_t size)
{
    std :: cout << size << "\n";
}

template <size_t N>
void foo (char (&x) [N])
{
    foo (x, N);
}

int main () {
    foo (a);
    foo (b);
}

这会打印22\n33\n

答案 4 :(得分:0)

void print_array( int array[] )void print_array( int *array )同义。进行函数调用时不会传递大小信息,因此sizeof在这里不起作用。

答案 5 :(得分:0)

以下所有声明完全相同:

void print_array(int array[]);
void print_array(int array[10]);
void print_array(int array[200]);
void print_array(int array[1000]);
void print_array(int *array);

这意味着,在所有上述情况下,sizeof(array)都会返回sizeof(int*)的值,即使在使用整数的情况下(实际上编译器也会忽略它们)。

但是,以下所有内容彼此不同,并且同时在一个程序中共存:

void print_array(int (&array)[10]);
void print_array(int (&array)[200]);
void print_array(int (&array)[1000]);

int a[10], b[200], c[1000], d[999];
print_array(a); //ok - calls the first function
print_array(b); //ok - calls the second function
print_array(c); //ok - calls the third function
print_array(d); //error - no function accepts int array of size 999

答案 6 :(得分:0)

对于这样的算法,我喜欢使用迭代器,然后你可以做你想要的......例如。

template <typename Iterator>
void print(Interator begin, Iterator end)
{
  std::cout << "size: " << std::distance(begin, end) << std::endl;
  std::copy(begin, end, std::ostream_iterator<std::iterator_traits<Iterator>::value_type>(std::cout, ", "));
}

致电

print(a, a + 5); // can calculate end using the sizeof() stuff...

答案 7 :(得分:0)

只是已发布的所有答案的补充:

如果你想使用一个更舒服的数组(例如java中的ArrayList),那么只需使用stl-vector container,它也能够返回size