数组和sizeof编译错误C++时出现问题

Array and sizeof troubles compiling errors C++

本文关键字:问题 C++ 错误 sizeof 编译 数组      更新时间:2023-10-16

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

手头的任务是创建一个函数,该函数接受未知数量的整数数组,并对数组中的偶数求和。我被告知数组的最后一个条目是-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++格式可能很奇怪。谢谢你看。

问题是,当作为参数传递给函数时,数组会衰减为指向第一个元素的指针,因此函数

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

实际上等于

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

取指针的大小返回指针的大小,而不是指针指向的内容

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

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

当您将数组传递给函数时,数组会衰减为指针。这意味着有关阵列大小的信息将丢失。

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

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

然而,在C++中,您可能应该使用std:: vector,除非您有特定的理由坚持使用数组,因为数组是出了名的容易出错。