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 为什么我不能得到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

当我运行这段代码时,我得到一个6位数的总和,它看起来更像一个地址。那么,我到底做错了什么呢?

,而(*p)
是一种非常惯用的处理C中字符串的方法,因为它们具有以null结尾的有用属性。一旦到达空终止符(数值为0的字符),
*p
为0,循环结束

您的数组没有此属性,因此
而(*p)
在整个数组长度上为true,则超出了界限,这是未定义的行为

你的选择是:

  • 将大小与数组一起传递,并使用
    inti=0;而(i
    或更惯用的
    表示(inti=0;i
  • 使用指定的sentinel值指示数组的结尾,并使用
    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;
    }