【问题标题】:Sum of an array数组的总和
【发布时间】:2014-12-04 05:23:51
【问题描述】:

我不明白为什么我的程序只打印数组中的第一个数字。 似乎它只循环一次,然后有些东西打破了循环。输出为 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);
}

【问题讨论】:

  • 自 C99 起不支持隐式 int。不要再使用它了。

标签: c function loops


【解决方案1】:
sizeofarr = sizeof(arr) / sizeof(arr[0]);

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

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

【讨论】:

  • 它不会衰减为指针,函数参数一个指针,尽管它看起来不是。
  • @Deduplicator 我指的是main() 中的数组arrsum_arr() 中的指针arr
  • 在函数中仍然没有衰减,但是当通过时,是更早的。否则,您可以在函数中以某种方式防止衰减。
【解决方案2】:

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

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

【讨论】:

  • int 的大小为 16 位或更多,至少为一个字节。指针的大小至少为一个字节。在现代系统上,它们通常是 4 个各自的 4/8 字节。
【解决方案3】:

按以下方式更改代码

#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 );
  }

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

考虑到 C 标准中的这句话(6.3.2.1 左值、数组和函数指示符)

3 除非它是 sizeof 运算符的操作数或一元 & 运算符,或者是用于初始化数组的字符串文字, 具有 ''array of type'' 类型的表达式被转换为 类型为“pointer to type”的表达式,指向初始 数组对象的元素 并且不是左值。如果数组对象 有注册存储类,行为未定义。

【讨论】:

  • 你的代码的问题是......数组参数实际上不是数组参数,而是伪装的指针参数。
  • @Deduplicator 你完全错了。 arr 被定义为一个数组。只需将其转换为指针。
  • 我想你是因为语言上的困难而绊倒的。或者你读错了标准。
  • @Deduplicator 没有语言问题。程序中有将 arr 定义为数组。 arr 未定义为指针。
  • @Deduplicator 我看到是你有语言障碍。 arr 不是函数参数。它在函数 main 中定义为一个数组。
【解决方案4】:

总之,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);
}

【讨论】:

  • 事实上你用你自己的话重写了我的答案。:)
  • 事实上,是的。我做到了,因为@Deduplicator 不同意你的看法。我对这个主题做了一些研究。
猜你喜欢
  • 2015-12-16
  • 2018-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2020-10-18
相关资源
最近更新 更多