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