C运 行时的大小,编译时

问题描述 投票:0回答:2

enter image description here

我认为可以在编译时计算指针大小,因为您应该在编译时指定32位编译或64位编译。

但是在那种情况下,为什么要在运行时计算sizeof?

https://en.wikipedia.org/wiki/Sizeof

在维基百科上,sizeof在运行时(大多数是在编译时)计算灵活数组。

c sizeof
2个回答
2
投票

在这两种情况下,sizeof的结果在编译时都是已知的。在第一种情况下,它是int *的大小,在第二种情况下,它是长度为10的int数组的大小。

幻灯片似乎认为第一种情况下的sizeof会给您分配的内存量,但是事实并非如此。用户必须跟踪分配了多少空间以确保不超出范围。

[在运行时唯一计算sizeof的时间是针对可变长度数组,例如:

int x = foo();
int arr[x];
printf("size=%zu\n", sizeof(arr));

此行为由C standard的6.5.3.4p2节规定:

sizeof运算符产生其大小(以字节为单位)操作数,可以是表达式或a的括号名称类型。大小由操作数的类型确定。的结果是一个整数。如果操作数的类型是可变长度数组类型,对操作数求值;否则,操作数不是求值,结果是一个整数常量。


0
投票

是的,还可以在编译时确定指针的大小,而不仅仅是在运行时确定。

[我相信这是在第一种情况下,x表示(即x指向)的int数组的大小只能在运行时确定,因为它是从对malloc的调用返回的(即动态内存分配)。但是,这种措辞似乎仍然不合适,因为malloc是用在编译时已知的常量值调用的。但是,sizeof运算符不知道这一点。它只会返回指针本身的大小。

© www.soinside.com 2019 - 2024. All rights reserved.