sizeof(数组)如何在运行时工作?

dar*_*dow 24 c sizeof

我已经读过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)

这能解释引擎盖下的情况吗?(不要被那些看起来很傻的临时变量所拖延 - 这是我要求中间代码转储时程序的静态单一赋值形式的工件.)

  • 将要编译的文件放在目录中,然后从该目录中的shell调用gcc,将`-fdump-tree-all`添加到命令行选项中(您可能需要`-S`和` - O2`以及).您需要在临时目录中隔离该文件,因为这将生成大约100个中间代码文件(并且这只是优化管道的前半部分;`-fdump-rtl-all`将为您提供另外60个文件).然后你可以按顺序阅读它们(它们已编号) (4认同)

Ant*_*les 7

从C99标准:

6.5.3.4

sizeof操作者产生其操作数的大小(以字节为单位),其可以是表达或类型的括号名称.大小由操作数的类型确定.结果是整数.如果操作数的类型是可变长度数组类型,则计算操作数 ; 否则,不评估操作数,结果是整数常量.