在c ++函数中传递数组

时间:2016-03-04 17:05:45

标签: c++ arrays function pointers

我想问一个问题:我想编写一个可以传递数组的函数,然后该函数可以从用户读取值并填充数组。

但实际上在每个新问题中我都有不同类型的数组。有时它是int,有时它也可能是长期未签名的。

所以我写了这样的代码:

#include <iostream> 
#define MY_TYPE long long
using namespace std;

void f(MY_TYPE a[ ], MY_TYPE min, MY_TYPE max)
{
    MY_TYPE i;

    for(i = min; i < max; i++)
       cin>>a[i];
}

int main()
{
int x [5], i;
f ( (MY_TYPE*) x,(MY_TYPE) 0,(MY_TYPE) 5);
for(i=0;i<5;i++) cout<< x[i];
}

但是当我想运行它时,在输入五个值后,我得到一个运行时错误。它在屏幕上不打印任何内容。我该如何解决?或者还有其他方法吗?任何帮助将不胜感激。谢谢

3 个答案:

答案 0 :(得分:3)

由于您使用的是C ++,而不是C,因此您应该使用C ++容器。

#include <array>

void f(std::array<int, 5>& a, size_t start, size_t end)
{
    for (auto i = min; i < max; ++i)
    {
        cin >> a[i];
    }
}

如果要将此用于任何类型,则必须使用template

template<typename T, size_t N>
void f(std::array<T, N>& a, size_t start, size_t end)
{
    for(auto i = min; i < max; ++i)
    {
        cin >> a[i];
    }
}

现在你可以这样做:

int main()
{
    std::array<int, 5> integers;
    std::array<float, 10> floats;

    f(integers, 0, integers.size())
    f(floats, 0, floats.size())
}

答案 1 :(得分:1)

x被定义为5 int s的数组。当您致电f时,您将x投放到MY_TYPE* long long。如果是sizeof(int) != sizeof(long long),那么当您遍历f中的数组时,您要么切片元素的内容,要么离开数组的末尾。如果您将x更改为MY_TYPE x [5],那么它可以正常工作。

答案 2 :(得分:0)

您定义了一个int

数组
int x [5], i;

然后继续使用它,好像它是MY_TYPE

的数组
f ( (MY_TYPE*) x,(MY_TYPE) 0,(MY_TYPE) 5);

由于代码中的sizeof(int)小于sizeof(MY_TYPE),这将导致访问超出有效限制的内存,从而导致未定义的行为。在您的情况下,UB显示为运行时错误。

使用MY_TYPE数组而不是int数组。

MY_TYPE x[5], i;
f ( x, (MY_TYPE) 0, (MY_TYPE) 5);

如果您知道如何使用功能模板,则可以使用功能模板。

template <typename T>
void f(T a[], size_t min, size_t max) // Type of min and max should not
{                                     // depend on T
    size_t i;
    for(i=min;i<max;i++)
       cin>>a[i];
}

int main()
{
   int x [5], i;
   f (x, 0, 5);
   for(i=0;i<5;i++) cout<< x[i];
}