【问题标题】:How to print the sum of a passing a int array as a parameter如何打印作为参数传递的 int 数组的总和
【发布时间】:2022-01-03 09:26:59
【问题描述】:
#include <stdio.h>
int sumofArrayNum(int numList[]);

int main(){
int result,numList[]={23,32,54,23,54,32,3,35};

result = sumofArrayNum(numList);
printf("sum= %d", result);
return 0;
}

int sumofArrayNum(int numList[]){
 int sum = 0;

  for(int i = 0; i < 10; ++i){
   sum += numList[i];
  }
  return sum;
}

每次构建和运行它时输出都不同。 例如。输出为 sum = 1032918821

我想要的预期输出是 sum = 256

【问题讨论】:

  • 数组中有多少个元素?你数了多少元素?
  • 数组内最多 10 个元素。是不是因为我将值设置为10,所以我必须输入10个元素。输入会更好解决这个问题
  • 它不能遍历一个只有 8 个元素的数组 10 次。你认为不存在的元素来自哪里?当您的数组仅包含 8 个时,没有 所有 10 个元素 可以求和。想想看。如果你在一张纸的一栏中写 8 个数字,你怎么能把 10 个数字相加?你不能,因为第 9 个和第 10 个数字不存在。在编程中,您正在读取的那些额外的两个不存在的元素是从未初始化的堆栈内存中读取的,这意味着它们是垃圾,这就是为什么您每次都会得到不同的总数。
  • 没有。更好的解决方案是修改求和函数以接受第二个参数,即数组的长度。然后,您可以将其用作循环的终止条件,允许您将任何大小的数组传递给函数。
  • 我已经为您提供了您需要的信息。努力自己实现它 - 与我为你做相比,你会学到更多。

标签: c function parameters sum


【解决方案1】:

int numList[] 等参数与int* numList 相同,如果没有显式定义,编译器将不知道它的元素数。顺便说一句,int numList[8] 也与int* numList 相同。 C 语言检查数组的范围。

有一些方法可以获取和检查数组大小。

  • 大小/计数参数
int sumofArrayNum(int numList[], int listSize){
 int sum = 0;
  for(int i = 0; i < listSize; ++i){
   sum += numList[i];
  }
  return sum;
}

这里listSize 应该是元素的count

并且可以使用宏来隐藏count参数:

#define sumofArray(array) sumofArrayNum((array), sizeof(array)/sizeof(*array))
  • 指向整个数组
int sumofArrayNum(int (*numList)[8]){
 int sum = 0;
  for(int i = 0; i < sizeof(*numList)/sizeof(**numList); ++i){
   sum += (*numList)[i];
  }
  return sum;
}

通过发送数组指针调用它:

result = sumofArrayNum(&numList);

编译器(例如 gcc)可以对此进行弱检查:如果您发送的数组不是 int (*)[8],则会发出警告。

注意一定要保证数组的有效性,数组的大小必须是恒定的。


另外,

每次构建和运行时输出都不同。

因为只定义了8个元素,索引范围是0〜7numList[8]numList[9] 未定义,表示任何值都是可能的。可能被使用,被其他进程改变,随机且危险。

【讨论】:

    【解决方案2】:

    numlist 中有 8 个元素,表示 for 循环必须执行代码 8 次。 您的代码必须是:

    for(int i = 0; i < 8; ++i)
    {
       sum += numList[i];
    }
    

    这段代码一直循环到i=7,当i=8结束循环。

    for loop的信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-23
      • 2020-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-30
      相关资源
      最近更新 更多