当前位置: 华文星空 > 知识

c语言中的sizeof()是如何分辨数组名和指针的?

2021-06-25知识

那句经典名句怎么说来着: 调试器下无秘密。

如果你用调试器查看一下 反汇编 指令,真相就会大白。

来把你的printSize函数再写一个版本,一个是你原来写的,一个是直接用指针作为参数:

void printSize ( int a [ 10 ]) { printf ( "%d \n " , sizeof ( a )); } void printSize2 ( int * a ) { printf ( "%d \n " , sizeof ( a )); } int main () { int size = sizeof ( a ); printSize ( a ); printSize2 ( a ); return 0 ; }

我们来看一下,调用这两个函数的反汇编指令有什么不同?

看到了吧?一毛一样!

再来看下main函数中这行代码的反汇编是什么样的:

int size = sizeof ( a );

看到了吗,直接就赋值了,没有什么计算的过程。

结论:

1、sizeof是编译时就确定的,而不是等到运行时,具体是指针还是数组,编译器在编译当前函数时,自然可以根据定义来分辨。

2、但通过函数传参以后,数组一律都是变成了地址传递,长度信息就丢失了,和指针就是一样的,此时编译器无法再进行分辨。

所以就会出现你看到的那个现象。

如果觉得不错,帮忙给 @轩辕之风 点个赞哦~