具有随机长度的数组的sizeof()

时间:2011-08-17 13:43:24

标签: c gcc random sizeof

你能解释sizeof()如何使用随机长度数组吗?我认为在编译期间会计算数组上的sizeof(),但是,具有随机长度的数组的大小似乎是正确计算的。

示例:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

int main(){
    srand ( (unsigned)time ( NULL ) );
    int r = rand()%10;
    int arr[r]; //array with random length
    printf("r = %d size = %d\n",r, sizeof(arr)); //print the random number, array size
    return 0;
}

多次运行的输出:

r = 8 size = 32
r = 6 size = 24
r = 1 size = 4

编译器:gcc 4.4.3

4 个答案:

答案 0 :(得分:13)

在C99中,sizeof可变大小的数组是在运行时计算的。来自C99草案6.5.3.4/2:

  

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

答案 1 :(得分:3)

在您的代码中,arr是一种特殊的数组:它是 VLA (可变长度数组)。

标准(6.5.3.4)中sizeof的段落说

  

如果操作数的类型是可变长度数组类型,则评估操作数

所以它不是编译时常量

答案 2 :(得分:2)

在C99中,编译器非常聪明,知道在运行时调用rand()

答案 3 :(得分:2)

在C99中引入使用sizeof和VGA(可变长度数组)时,它们的大小是在运行时而不是编译时计算的。

查看有关主题here

的非常好的参考资料