【发布时间】:2017-05-11 12:03:44
【问题描述】:
我知道以前有人问过这个问题,但我的问题更具体, 这是代码:
#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 返回的值只是一个随机值,还是有意义的?
【问题讨论】:
-
由于可变长度数组,这不是有效的 C89 代码。它在 C99+ 中有效,其中 sizeof 显式地在 VLA 上执行运行时魔法(提示:什么是 74636 / 18659?)
-
让我们做一个练习 - 我们尝试将 18659 乘以 4。我们得到什么?
-
如果您只需要 ANSI C,请使用
-pedantic选项(使用-Werror)。 (关闭 GCC 的扩展。) -
顺便说一句,为了避免 UB,这应该是
printf("%zu\n", sizeof a);。 sizeof 返回一个 size_t,而不是 int。 -
TFM 说“-ansi 选项不会导致非 ISO 程序被无偿拒绝。为此,除了 -ansi 之外,还需要 -pedantic”。