首页 > 解决方案 > 为什么我没有得到正确的总和值?

问题描述

#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 值,它看起来更像是一个地址。那么我到底在做什么错呢?

标签: cpointers

解决方案


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

您的数组没有此属性,因此while(*p)对于数组的整个长度都是如此,然后它会超出范围,这是未定义的行为。

您的选择是:

  1. 将大小与数组一起传递,并以int i = 0; while (i < LENGTH){}更习惯的方式使用for(int i = 0; i < LENGTH; i++)
  2. 使用指定的标记值来指示数组的结束并使用while (*p != SENTINEL)

前一个选项是最省事的,并且不需要您将任意指定int为幻数。


推荐阅读