sizeof 计算问题求解

2021-07-14 15:40:02 +08:00
 JQiue
void foo(int *arr) {
  printf("%d\n", sizeof arr); // 4
}

int main(){
  int arr[] = {1, 2, 3, 4, 5};
  printf("%d\n", sizeof arr); // 20
  foo(arr);
}

对于上述代码的sizeof计算数组字节结果有些不太明白,arr很显然和arr[0]是等效的,为什么在主函数中计算arr的大小等于20(所有元素加起来的字节大小),而作为参数传递给另一个函数时却是4

2308 次点击
所在节点    C
26 条回复
wwbfred
2021-07-14 20:00:10 +08:00
所以不喜欢用 C 数组,只是考题倒是很喜欢考。
你说它是个类型吧,它又不能传递;你说它不是类型吧,他还有自己的大小。
这种不一致的表现,放到别的地方,就叫做坑。
lonewolfakela
2021-07-15 09:34:22 +08:00
@thinkIn 啥,哪家编译器的 sizeof 是用 define 定义的?
7075
2021-07-15 09:44:52 +08:00
C/C++数组传参,是传指针。在定义处,编译器有保留数组类型及数组长度的信息,所以可以用 sizeof 求长度。传参后参数类型转为指针,你 sizeof 求的是指针的 size 。
thinkIn
2021-07-15 10:14:25 +08:00
@lonewolfakela 我表述有误,不过可以看看用宏定义的 sizeof,虽然有限制,但是对理解指针很有好处。可以参看这个讨论 https://stackoverflow.com/questions/14171117/implementation-of-sizeof-operator
7075
2021-07-16 10:07:09 +08:00
@3dwelcome 并非总是如此,严格的说 C++是强类型语言,类型必须一致才能通过编译。但标准中也定义了 4 种较为隐晦的类型转换(无需程序员声明),能够在某些情况下满足强类型的检查。数组到指针就是其中一种,原因是因为数组类型很特殊,不光要记录数组长度,还要记录数组保存的元素的 size,这个东西,早期编译器是通过“内情向量”来实现的。 往下面细节就太多了。总之类型发生隐晦的变化。
JQiue
2021-07-17 14:29:34 +08:00
@LnTrx 谢谢大佬提供的教程网站

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/789496

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX