C ++ - 传递未知大小的数组

时间:2014-01-29 23:14:50

标签: c++ arrays pointers

尝试传递一个以1开头的连续数字的int数组,但假设接收此数组的函数不知道它的长度。当试图计算函数内部的长度时,它只给我1,因为它只在计算sizeof(arrayName)时找到第一个元素。

#include <iostream>
using namespace std;

int Sum(int intArray[]) {
    int n = sizeof(intArray) / sizeof(*intArray);
    cout << "Array size in function: " << n << endl;
    return n * (n + 1) / 2;
}

int main() {
    int anArray[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int arraySum = Sum(anArray);

    cout << "Array size in main: " << sizeof(anArray) / sizeof(*anArray) << endl;
    cout << "Sum is: " << arraySum;
    int a;
    cin >> a;
    return 0;
}

2 个答案:

答案 0 :(得分:8)

你的函数正在指向int。将数组传递给指针时,所有大小的信息都会丢失。但是您可以使用函数模板来实例化与正确数组大小匹配的函数:

template <size_t N>
int Sum(const int (&intArray)[N])
{
  cout << "Array size in function: " << N << endl;
  return std::accumulate(std::begin(intArray), std::end(intArray), 0);
}

Sum函数将接受在编译时已知的普通数组或大小。但是,对于这些情况使用std::array更有意义,或者在运行时选择大小时使用std::vector

请注意,对std::accumulate的调用只是解决总和问题的一个示例。它不需要N的知识,可以完全取代函数。该尺寸由std::beginstd::end处理。您需要分别为<numeric><iterator>添加标题accumulatebegin/end

答案 1 :(得分:2)

在此功能声明中

int Sum(int intArray[]);

作为参数传递给它的数组被隐式转换为指向数组第一个元素的指针。所以这个声明等同于

int Sum( int *intArray );

表达式

int n = sizeof(intArray) / sizeof(*intArray );

相当于

int n = sizeof( int * ) / sizeof( int );

如果sizeof(int *)等于sizeof(int)则n将等于1.

如果以您的方式声明参数,那么您还应该声明第二个参数,该参数将接受数组中的元素数。所以我会按照以下方式重写函数

int Sum( int intArray[], size_t n ) 
{
    int sum = 0;

    for ( size_t i = 0; i < n; i++ ) sum += intArray[i];

    return sum;
}

在main中我会按以下方式调用该函数

int arraySum = Sum( anArray, sizeof( anArray ) / sizeof( *anArray ) );

}

通常还会编写函数来执行一些通用算法。仅为具有从1到某些N的sequantial值的数组编写函数是一个坏主意。