我已经读过C中的sizeof运算符在编译时被解释,因为在编译时编译器知道数组大小及其类型,sizeof能够计算array占用的字节数.但是sizeof如何处理以下代码:
#include<stdio.h>
#include<string.h>
int main()
{
int n;
scanf("%d",&n);
int a[n];
int s=sizeof(a);
printf("%d",s);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这里的数组大小在编译时是不知道的,那么它是如何正常工作的?
oua*_*uah 27
sizeof始终在C89的编译时计算.从C99和可变长度数组开始,它是在运行时计算的,当可变长度数组是sizeof操作数中表达式的一部分时.
对于sizeof操作数的评估也是如此:它不在C89中进行评估,但在C99中如果操作数是可变长度数组类型则进行评估.例如:
int n = 5;
sizeof (int [n++]);
// n is now 6
Run Code Online (Sandbox Code Playgroud)
zwo*_*wol 14
由于您要应用于sizeof在编译时未完全知道其大小的可变长度数组,因此编译器必须生成代码以在运行时执行其中的一部分.
gcc 4.6.3的高级优化器转换你显示的代码
scanf ("%d", &n);
t12 = (long unsigned int) n;
t13 = t12 * 4;
__builtin_alloca (t13);
t16 = (unsigned int) t12;
t17 = t16 * 4;
s18 = (int) t17;
printf ("%d", s18);
Run Code Online (Sandbox Code Playgroud)
这能解释引擎盖下的情况吗?(不要被那些看起来很傻的临时变量所拖延 - 这是我要求中间代码转储时程序的静态单一赋值形式的工件.)