C语言取数组长度传参时的问题

C语言取数组长度传参时的问题,第1张

C语言取数组长度传参时的问题

通常我们取一个数组实际长度(个数,非字节数)时最常用的方法就是写一个宏函数,用字节数除去类型就可以得到实际长度

#define ArrSzie(arr) sizeof(arr)/sizeof(arr[0])

如果当用这个宏函数去取参数会怎样?

#include 
#define ArrSize(arr) sizeof(arr)/sizeof(arr[0])

int arr[10] = {0};

void test(int* var){
    
    printf("%dn",ArrSize(var));

}

int main(){

    test(arr);
    return 0;
}

输出结果:

2

这个结果很明显不对,理应是10,那么是为什么呢?

首先sizeof是编译命令,注意它是编译命令,不是API,这点需要注意,它仅在编译期间完成工作,当sizeof(int)时,在编译期间编译器会取当前类型所占大小,并替换,sizeof(int)则会变成4,但是当我们进行函数调用时传递数组的情况下会C语言默认会用一个指针指向数组地址,那么sizeof就变成了sizeof(int*),就被替换成了4,因为是编译期间的命令,所以只能根据实际参数的类型来做取值,不能去取指针指向内存的类型。

至于为什么输出为2,我的电脑是64位,编译的程序也是64位。

所以sizeof(arr) = 8

sizeof(arr[0]) = 4

8/4=2

这里讲一下为什么sizeof(arr[0])=4,因为arr[0],可以看成对指针进行解引用*(arr+0),最终输出结果是一个整数,那么C语言会将它以整型(int)处理,而arr则看成没有解引用的指针类型(int*)。

这里需要注意,指针和数组虽然使用的时候没有什么区别,但是在编译期间是有区别的,sizeof(arr)如果arr是数组类型,C语言编译器会取出数组总大小,如果是指针类型,则返回指针类型的size。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5432953.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存