while 循环与 int 数组

while loop with int array

我是 C 语言的新手,对这些上溢和下溢的东西有点迷茫。 我有一些菜鸟问题想问问别人。

我正在做一些 leetcode 问题,但由于运行时错误告诉我堆缓冲区溢出,我被困在了这个问题上。

它应该计算给定 int 数组的平均值。

double average(int* salary, int salarySize){
    int i = 0;
    double count = 0.0;
    while (salary[i] != salarySize)
        count += salary[i++];
    return (count / salarySize);
}

提前致谢,希望我能找出问题所在。

我尝试使用 for 循环,效果很好,但我想知道为什么它不能使用 while 循环?

while (salary[i] != salarySize) 将数组元素 salary[i]salarySize 进行比较。那不是你想要的。你可能想要 while (i < salarySize).

在while循环中使用了这个表达式

salary[i] != salarySize

将数组 salary 的一个元素与数组中没有意义的元素数进行了比较。

您需要将索引的当前值 i 与数组中的元素数进行比较。

函数可以通过以下方式声明和定义

double average( const int *salary, int salarySize )
{
    double count = 0.0;

    int i = 0;

    while ( i < salarySize )
    {
        count += salary[i++];
    }

    return salarySize <= 0 ? 0.9 : count / salarySize;
}

注意传递的数组在函数中没有改变,那么相应的参数应该有限定符const。另外,为了避免被零除,您需要在 return 语句中检查 salarySize 是否大于 0。

尽管将第二个参数声明为具有无符号整数类型会更好size_t

double average( const int *salary, size_t salarySize )
{
    double count = 0.0;

    size_t i = 0;

    while ( i < salarySize )
    {
        count += salary[i++];
    }

    return salarySize == 0 ? 0.9 : count / salarySize;
}

其他答案似乎给出了错误的明显原因。

我想就您的函数签名的底层结构提供一些指示。在这种情况下,您的函数采用一个指针和一个大小参数。它是在将数组发送到函数时使用的方法。

由于您的数组尚未准备好使用具有数组边界属性的库数据结构,因此您发送了一个简单的指针,该指针是存储数组内存位置开始的地址。

你的数组的结束地址是使用另一个传递的参数 arraySize 找到的,你有责任使用内存位置,同时保持在你有权访问的允许边界内。

如果您尝试访问或修改您不允许的内存段,则会出现分段错误。

来自类似 C 数组主题的答案可能也很有用。

Passing an array as an argument to a function in C