你能解释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
答案 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
的非常好的参考资料