C 为什么我不能得到sum的正确值? #包括 #包括 int-sumArray(int*p); int main(){ int数组[10]={1,2,3,4,5,6,7,8,9,10},和; int*p=数组; sum=printf(“数组的和为:%d”,sumArray(p)); 返回0; } int-sumArray(int*p){ 整数和=0; 而(*p){ 总和+=*p; p++; } 回报金额; }
当我运行这段代码时,我得到一个6位数的总和,它看起来更像一个地址。那么,我到底做错了什么呢?C 为什么我不能得到sum的正确值? #包括 #包括 int-sumArray(int*p); int main(){ int数组[10]={1,2,3,4,5,6,7,8,9,10},和; int*p=数组; sum=printf(“数组的和为:%d”,sumArray(p)); 返回0; } int-sumArray(int*p){ 整数和=0; 而(*p){ 总和+=*p; p++; } 回报金额; },c,pointers,C,Pointers,当我运行这段代码时,我得到一个6位数的总和,它看起来更像一个地址。那么,我到底做错了什么呢?,而(*p)是一种非常惯用的处理C中字符串的方法,因为它们具有以null结尾的有用属性。一旦到达空终止符(数值为0的字符),*p为0,循环结束 您的数组没有此属性,因此而(*p)在整个数组长度上为true,则超出了界限,这是未定义的行为 你的选择是: 将大小与数组一起传递,并使用inti=0;而(i
,而(*p)
是一种非常惯用的处理C中字符串的方法,因为它们具有以null结尾的有用属性。一旦到达空终止符(数值为0的字符),*p
为0,循环结束
您的数组没有此属性,因此而(*p)
在整个数组长度上为true,则超出了界限,这是未定义的行为
你的选择是:
inti=0;而(i
或更惯用的表示(inti=0;i
while(*p!=sentinel)
前一个选项最简单,不需要您将任意的
int
指定为幻数。因为您的数组不包含哨兵值零。您的代码通过读取数组末尾来调用UB。更好的方法是:使用数组中的元素数声明一个常量,将该计数传递给sumArray方法,并对循环使用。为什么循环条件while(*p)
?这与while(*p!=0)
相同。为什么任何随机数组都包含零?对于一个数字数组,它可能包含int
范围内的任何值,不能使用sentinel值。对于选项1,
循环的更为惯用。@RobertHarvey正确。
#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;
}