c - 为什么我没有得到正确的总和值?
问题描述
#include <stdio.h>
#include <stdlib.h>
int sumArray(int* p);
int main(){
int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, sum;
int* p = array;
sum = printf("The sum of the array is: %d", sumArray(p));
return 0;
}
int sumArray(int* p){
int sum = 0;
while(*p){
sum += *p;
p++;
}
return sum;
}
当我运行这段代码时,我得到一个 6 位数的 sum 值,它看起来更像是一个地址。那么我到底在做什么错呢?
解决方案
while(*p)
是在 C 中处理字符串的一种非常惯用的方式,因为它们具有以空值结尾的有用属性。一旦达到空终止符(数值为 0 的字符),*p
则为 0 并且循环结束。
您的数组没有此属性,因此while(*p)
对于数组的整个长度都是如此,然后它会超出范围,这是未定义的行为。
您的选择是:
- 将大小与数组一起传递,并以
int i = 0; while (i < LENGTH){}
更习惯的方式使用for(int i = 0; i < LENGTH; i++)
- 使用指定的标记值来指示数组的结束并使用
while (*p != SENTINEL)
前一个选项是最省事的,并且不需要您将任意指定int
为幻数。
推荐阅读
- visual-studio - 我们可以自定义 Visual Studio 的颜色主题(不是 VS Code,不是编辑器颜色)吗?
- api - TikTok API 认证
- javascript - 使用选择选项的onchange函数在javascript中不起作用
- java - 使用 jdb 调试 Java servlet。如何将 jdb 与 Tomcat 连接
- java - 如何从底页导航到活动
- python - Python中的文本文件行计数器返回错误的行数
- cookies - 如果 cookie 策略需要选择加入,UTM 是否可以存储在 cookie 中以进行归属?
- bash - 如何在 BASH 中将多个文件插入到单个 ext 程序中
- sql - 在某些日期缺少数据时聚合数据的问题
- python - 将查询结果保存在变量上