数组名作为变量使用时需要注意的陷阱

上周做项目时,在利用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)直接被汇编成一个立即常量。

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ltshan139

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值