如果有以下内容,我会得到一些东西:
double average (double scores[]){
double sum = 0;
int n;
int nscores = sizeof(scores)/sizeof(double);
for (n=0 ;n<nscores ;++n){
sum+=scores [n];
return sum/nscores;
}
我发送这个函数是这样的数组:
double scores[3]={1,2,3};
为什么sizeof(分数)会为0?
答案 0 :(得分:6)
sizeof(scores)
等同于sizeof(double *)
:编译器无法判断数组的大小。
它不会为零,但因为sizeof(scores)
和sizeof(double)
都是整数类型的表达式,sizeof(scores)/sizeof(double)
是整数除法,所以如果sizeof(scores) < sizeof(double)
1}},然后sizeof(scores)/sizeof(double) == 0.
答案 1 :(得分:3)
这是因为作为函数参数的数组被视为指针。例如,
double average (double scores[]);
......相当于:
double average (double *scores);
所以sizeof(scores)/sizeof(double)
等于sizeof(double *)/sizeof(double)
,如果碰巧这些类型的大小相同,则结果为1
,但如果double的大小为8和指针只有4,结果是0
。
答案 2 :(得分:1)
C中有关数组的两件事:
除非它是sizeof
或一元&
运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字,否则表达式为“N” T
的元素数组将被替换为(“衰减到”)类型为“T
的指针”的表达式,其值是数组的第一个元素的地址。
在函数参数声明的上下文中,T a[]
和T a[N]
与T *a
相同; IOW,a
被声明为指向T
的指针,而不是数组。请注意,这仅适用于函数参数声明。
当您从主要功能调用average(scores)
时,表达式scores
将替换为double *
类型的另一个表达式,因此average
收到的是指针值,而不是数组。因此,获取元素数量的sizeof
技巧在average
函数中不起作用。您必须将scores
中的元素数作为单独的参数传递,如下所示:
double average(double *scores, size_t count)
{
...
}
并将其命名为
average(scores, sizeof scores / sizeof *scores); // or pass a constant 3, or
// something similar.
答案 3 :(得分:0)
scores
是一个double * const,因此sizeof(scores)
将是存储指针所需的大小