编译错误的数组和大小问题C ++

时间:2016-03-24 06:03:45

标签: c++ arrays compilation compiler-errors sizeof

我正在编写一个基于数组的代码,在编译失败后会给我带来一些令人困惑的错误。我在互联网上搜索了我或多或少了解的示例代码,但在我自己的代码/思考过程中识别错误对我有帮助。

手头的任务是创建一个函数,该函数接受一个未知数量的整数数组,并对数组中的偶数求和。我被告知数组的最后一个条目是-1,但我不认为这些信息是有用的。

这是我的代码:

#include <iostream>
using namespace std;

int sumEven(int myArray[])
{
int len = (sizeof(myArray) / sizeof(myArray[0]));
int i = 0;
int count = 0;

while (i < len)
{
    if (myArray[i] % 2 == 0)
    {
    count = count + myArray[i];
    }
    i++;    
}

return count;
}

我尝试将len定义为数组元素的数量。我认为这不起作用,因为一个错误引用了这一行:

prog.cpp:13:18: error: sizeof on array function parameter will return size of 'int *' instead of 'int []' [-Werror,-Wsizeof-array-argument]
int len = (sizeof(myArray) / sizeof(myArray[0]));
                 ^
prog.cpp:11:17: note: declared here
int sumEven(int myArray[])
                ^
1 error generated.

我有使用Matlab,Mathematica和Python的经验,所以我的C ++格式可能很奇怪。谢谢你看看。

2 个答案:

答案 0 :(得分:2)

问题是当作为参数传递给函数时,数组会衰减到指针到第一个元素,所以函数

int sumEven(int myArray[]) { ... }

实际上等于

int sumEven(int *myArray) { ... }

取指针的大小会返回指针的大小,而不是指向的大小。

如果你需要知道函数的大小,你应该传递元素的数量作为参数:

int sumEven(int *myArray, size_t len) { ... }

答案 1 :(得分:1)

当您将它们传递给函数时,

数组衰减到指针。这意味着有关阵列大小的信息将丢失。

这意味着(sizeof(myArray) / sizeof(myArray[0]))在此上下文中不会执行您想要的操作,因为此处myArray是指针。

规范解决方案是添加另一个表示数组大小的参数,然后使用它。这是C中使用的方法。

但是,在C ++中,你可能应该使用std:: vector,除非你有特定的理由坚持数组,这是众所周知的错误。