上周做项目时,在利用sizeof(数组名)求数组大小时 遇到一个小陷阱,特意记录下来加深印象。
实例code如下:
1)static void PrintArray(int a[10])
{
int i, j;
j = sizeof(a);
for (i = 0; i < j/sizeof(int); i++)
... ...
}
2)int main(void)
{
int a[10] = {3, 4, 5};
int j;
j = sizeof(a);
... ...
return 0;
}
在上面2段code中,sizeof(a)的值不一样。
第二段code中,j=40, 其对应的汇编如下:
movl $0x28,-0x10(%ebp)
第一段code中,j = 4,这是因为当数组名作为函数参数传递时,它就退化成指针,其前加上sizeof运算符,就变成指针大小,而不是数组大小了。
其对应的汇编如下:
movl $0x4,-0xc(%ebp)
总结: 我们往往容易犯错误,即数组作为函数参数时,仍然用sizeof(arrayName)来获得数组占多少个字节数, 另外,从汇编语句中可知,一个数组大小在编译时就是已知的,sizeof(Variable)直接被汇编成一个立即常量。