我知道之前已经问过这个问题,但我的问题更具体, 这是代码:
#include <stdio.h>
#include <time.h> /* must be included for the time function */
main()
{
time_t t = time(NULL);
srand((unsigned) t);
int i = rand();
int a[i];
printf("%d\n", i); /* ouptut: 18659 */
printf("%d\n", sizeof a); /* output: 74636 */
}
我使用gcc和-ansi选项编译此代码,以限制它仅识别ANSI C. 我知道编译器无法在编译时知道数组的大小,因为它是在运行时随机确定的。 现在我的问题是 sizeof返回的值只是一个随机值,还是有意义?
答案 0 :(得分:6)
在编译时为大多数操作数评估sizeof
运算符。对于VLA,它在运行时进行评估。
来自C standard的第6.5.3.4节:
2
sizeof
运算符产生其操作数的大小(以字节为单位),可以是表达式或类型的带括号的名称。该 大小由操作数的类型决定。结果是 整数。 如果操作数的类型是可变长度数组类型, 操作数被评估;否则,不评估操作数 结果是一个整数常量
因此sizeof
返回的大小是VLA的字节大小。在您的示例中,这将是i * sizeof(int)
答案 1 :(得分:3)
sizeof
返回的值是一个伪随机值,其含义为:
a
的大小,以字节为单位rand
确定数组元素的数量时才是随机的。您系统上的sizeof(int)
似乎是4,因为sizeof
返回的数字是数组中元素数量的四倍。
注意:在C99中允许VLA的一个后果是sizeof
不再是纯粹的编译时表达式。当sizeof
运算符的参数是VLA时,结果将在运行时计算。
答案 2 :(得分:2)
sizeof返回的值只是一个随机值,还是有意义?
它确实有意义,74636
/ 18659
= 4
,显然是你机器上int
的大小。
所以sizeof
(由于参数是VLA,将在运行时而不是编译时计算)将以字节为单位返回数组a
的大小,这是它包含的int
(换句话说,i
或18659
)乘以int
的大小,即机器上的4
。
由于i
(rand
的结果)是随机的,因此您可以认为sizeof
的值在这个意义上也是随机的。
答案 3 :(得分:2)
-ansi选项不会导致非ISO程序被无偿拒绝。为此,除了-ansi之外,还需要-Wpedantic。