我认为可以在编译时计算指针大小,因为您应该在编译时指定32位编译或64位编译。
但是在那种情况下,为什么要在运行时计算sizeof?
https://en.wikipedia.org/wiki/Sizeof
在维基百科上,sizeof在运行时(大多数是在编译时)计算灵活数组。
在这两种情况下,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的括号名称类型。大小由操作数的类型确定。的结果是一个整数。如果操作数的类型是可变长度数组类型,对操作数求值;否则,操作数不是求值,结果是一个整数常量。
是的,还可以在编译时确定指针的大小,而不仅仅是在运行时确定。
[我相信这是在第一种情况下,x表示(即x指向)的int数组的大小只能在运行时确定,因为它是从对malloc的调用返回的(即动态内存分配)。但是,这种措辞似乎仍然不合适,因为malloc是用在编译时已知的常量值调用的。但是,sizeof运算符不知道这一点。它只会返回指针本身的大小。