今天发现了一个小问题,函数形参定义为指针,然后传入了一个数组,在函数内部用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");
}
运行结果:
由此可见,数组作为实参传入函数的都是首个成员变量的地址。至于为什么是这样,有空再进行深入研究。