sizeof 与数组

今天发现了一个小问题,函数形参定义为指针,然后传入了一个数组,在函数内部用sizeof得到数组的长度,发现一直是4不变,具体代码简化如下:

void test1(uint8_t *buf)
{
  printf("buflen:%d\n",sizeof(buf));
}

uint8_t buf[10]=[1,2,3,4,5,6,7,8];

int main()
{
    test1(buf);
}

结果为 buflen:4

考虑到可能是形参定义的是指针的缘故,后面改为定义为数组

void test2(uint8_t buf[])
{
  printf("buflen:%d\n",sizeof(buf));
}

uint8_t buf[10]=[1,2,3,4,5,6,7,8];

int main()
{
    test2(buf);
}

结果为 buflen:4

结果还是4,这下真想不通了,然后继续试:

void test2(uint8_t buf[8])
{
  printf("buflen:%d\n",sizeof(buf));
}

uint8_t buf[10]=[1,2,3,4,5,6,7,8];

int main()
{
    test2(buf);
}

结果为 buflen:4

结果依然是不是想要的,再想,假如我传入是整个数组的首地址呢,test1[&buf],test2[buf],结果依然是4。
仔细回想一下buf[10],buf—数组名,数组的首个成员的地址;&buf–整个数组的地址;&buf[0]数组的首个成员的地址。当将buf传入函数时,传入的不是数组名,而是数组的地址或者首个元素的地址,那么在函数内部用sizeof(buf)得到的始终是地址的长度,32位系统下,任何地址的长度都是四个字节,所以始终得到结果为4。
如果函数内部要用到数组的长度,那么只能在形参里定义一长度变量,用于传入数组长度。最好的办法是是宏定义一个长度:

#define BUF_LEN 1024
uint8_t buf[BUF_LEN];
为了进一步理解buf与&buf区别,右做了一下代码:
unsigned char buf[10] = {1,2,3,4,5,6,7,8};
void test1(uint8_t *buf)
{
  printf("buflen:%d\n",sizeof(buf));
  printf("bufaddr:%d\n",buf);
  printf("bufaddr:%d\n",buf+1);
}
void test2(uint8_t buf[])
{
  printf("buflen:%d\n",sizeof(buf));
    printf("bufaddr:%d\n",buf);
  printf("bufaddr:%d\n",buf+1);
}
int main()
{
    printf("***********************************\n");
    test1(buf);
    test1(&buf);
    test2(buf);
    test2(&buf);
    printf("buflen:%d\n",sizeof(buf));
    printf("buf:%d\n",buf);
    printf("buf:%d\n",buf+1);
    printf("&buf+1:%d\n",&buf+1); //为buf + sizeof(buf)
    printf("***********************************\n");
  }

运行结果:
运行结果
由此可见,数组作为实参传入函数的都是首个成员变量的地址。至于为什么是这样,有空再进行深入研究。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值