我正在编写一个基于数组的代码,在编译失败后会给我带来一些令人困惑的错误。我在互联网上搜索了我或多或少了解的示例代码,但在我自己的代码/思考过程中识别错误对我有帮助。
手头的任务是创建一个函数,该函数接受一个未知数量的整数数组,并对数组中的偶数求和。我被告知数组的最后一个条目是-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 ++格式可能很奇怪。谢谢你看看。
答案 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
,除非你有特定的理由坚持数组,这是众所周知的错误。