数组的总和

时间:2014-10-09 10:09:46

标签: c function loops

我无法理解为什么我的程序只打印数组中的第一个数字。 它似乎只循环一次,然后一些东西打破了循环。输出是232。

#include <stdio.h>

int main( int argc, char* argv[]){
 int sum_arr(int arr[]);
 int arr[5]={232,44,3,4,5};
 printf("%d\n",sum_arr(arr));

 return 0;
}

sum_arr(int arr[]){ 
  int i,sum=0,sizeofarr=sizeof(arr)/sizeof(arr[0]);
  for(i=0;i<=(sizeofarr-1);i++){
    sum+=arr[i];
  }
  return (sum);
}

4 个答案:

答案 0 :(得分:4)

sizeofarr = sizeof(arr) / sizeof(arr[0]);

计算数组大小的这个技巧并不起作用。因为在函数中,arr衰减到指针而不是数组。

要解决此问题,请明确传递大小。

答案 1 :(得分:2)

请记住,在C中将数组作为参数传递给函数时,实际上您将指针传递给数组。

由于指针和int的大小为4或8,您将获得sizeof(int *)/sizeof int 4/4 = 1 表示32位机器和 8/4 = 2 (64位) 1 2

答案 2 :(得分:2)

按以下方式更改代码

#include <stdio.h>

nt main( int argc, char* argv[])
{   
    int sum_arr( int arr[], size_t n );
    int arr[5] = { 232, 44, 3, 4, 5 };

    printf( "%d\n", sum_arr( arr, sizeof( arr ) / sizeof( *arr ) ) );

    return 0;
}


  int sum_arr( int arr[], size_t n )
  { 
      int i = 0, sum = 0;

      for ( ; i < n ;i++ )
      {
          sum += arr[i];
      }

      return ( sum );
  }

代码的问题在于作为参数传递的arrray被隐式转换为指向其第一个元素的指针。所以在函数sum_array中你使用了sizeof(int *)/ sizeof(int),你的系统等于1。

考虑C标准的引用(6.3.2.1 Lvalues,数组和函数指示符)

  

3除非它是sizeof运算符或一元&amp;的操作数。   operator,或者是用于初始化数组的字符串文字,a   具有''类型''数组的表达式将转换为   带有''指向类型'的指针的表达式,指向初始值   数组对象的元素并且不是左值。如果是数组对象   具有寄存器存储类,行为未定义。

答案 3 :(得分:0)

总之,C程序中的数组名称(在大多数情况下)转换为指针。一个例外是当我们在数组上使用sizeof运算符时。如果在这次竞赛中arr被转换为指针,sizeof(arr)将给出指针的大小而不是实际数组的大小,这将是相当无用的,因此在这种情况下,a表示数组本身。

在我的程序中,传入函数的数组被转换为指针。然后,sum_arr函数中的sizeof(arr)给出指针的大小而不是实际数组的大小。

这个程序应该以这种方式执行:

#include <stdio.h>

#define SIZEOFARR(arr) (sizeof(arr)/sizeof(arr[0]))

int main(){

 int sum_arr(int arr[],int size);
 int arr[5]={232,44,3,4,5};
 printf("The sum of the array is: %d\n",sum_arr(arr,SIZEOFARR(arr)));


  return 0;
}

int sum_arr(int arr[],int size){
  int i,sum=0;
  for(i=0;i<size;i++){
  sum+=arr[i];
  }
  return (sum);
}