C 函数内数组大小计算错误
以下是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");
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”,因为处理长度比处理大小更正常(我相信这正是您的意思)。