C 函数内数组大小计算错误

C 函数内数组大小计算错误,c,arrays,C,Arrays,以下是C程序: int doStuff(int afm[]); int main(){ int afm1[9] = {1,2,3,4,5,6,7,8,9}; //size=9 int afmLength = sizeof(afm1)/sizeof(int); printf("main: Length Of Array=%d\n", afmLength); //9 OK int k = doStuff(afm1); system("PAUSE");

以下是C程序:

int doStuff(int afm[]);

int main(){
    int afm1[9] = {1,2,3,4,5,6,7,8,9}; //size=9

    int afmLength = sizeof(afm1)/sizeof(int);
    printf("main: Length Of Array=%d\n", afmLength);  //9 OK

    int k = doStuff(afm1);

    system("PAUSE");
    return 0;   
}

int doStuff(int afm[]){
    int afmLength = sizeof(afm)/sizeof(int);    
    printf("doStuff: Length Of Array=%d\n", afmLength);  //1 WRONG

    return 1;
}
生成以下输出:

main: Length Of Array=9
doStuff: Length Of Array=1

为什么数组大小在main中计算正确,但在函数中计算错误?

因为在
main
中有一个数组,并且在函数中有一个指向该数组的指针

int doStuff(int afm[])
相当于

int doStuff(int *afm)

除了David Heffernan的答案(这是正确的)之外,还应该有另一个参数,即传递到
doStuff
方法的数组长度。

来自C语言标准(草案):

6.3.2.1左值、数组和函数指示符

3除非它是
sizeof
运算符或一元
&
运算符的操作数,或者是 字符串文字用于初始化数组,类型为“”的数组类型“”的表达式为 已转换为类型为“指向类型的指针”且指向的初始元素的表达式 数组对象,并且不是左值。如果阵列对象具有寄存器存储类,则 行为是未定义的。 记住这段话,因为C编程中最令人心痛的地方之一是C如何处理数组表达式

当您调用
doStuff(afm1)时
,表达式
afm1
从类型“9元素数组的
int
”隐式转换为“指向
int
”的指针,表达式的值与
&afm1[0]
相同。因此,
doStuff
接收的是指针值,而不是数组

在函数参数声明的上下文中,
ta[]
ta[N]
都被解释为
ta*a

6.7.5.3功能声明器(包括原型)

7作为“类型数组”的参数声明应调整为“指向 类型“”,其中类型限定符(如果有)是在 数组类型派生。如果关键字
static
也出现在 数组类型派生,然后为每个函数调用 实际参数应提供对数组的第一个元素的访问,该元素至少具有相同的数量 由大小表达式指定的元素。 由于
doStuff
接收指针值而不是数组,因此
sizeof
技巧不起作用。通常,您必须显式地告诉函数要传递给它的数组有多大;您无法从指针值本身确定这一点

因此,当您从
main
调用
doStuff
时,需要执行以下操作

doStuff(afm1, sizeof afm1/sizeof *afm1);
...
int doStuff(int *afm, size_t afmsize)
{
  ...
}

谢谢你,大卫。我应该写什么呢?阿戈特的回答告诉你。函数
doStuff
没有关于数组长度的信息。您需要将该信息连同指向数组的指针一起传递到函数中。+1我将“size”更改为“length”,因为处理长度比处理大小更正常(我相信这正是您的意思)。