sizeof 与数组

来源:互联网 发布:中国编程语言排名 编辑:程序博客网 时间:2024/05/17 23:59

今天发现了一个小问题,函数形参定义为指针,然后传入了一个数组,在函数内部用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 1024uint8_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 0
原创粉丝点击