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
我是 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