C

时间:2017-05-11 12:03:45

标签: c arrays sizeof ansi c89

我知道之前已经问过这个问题,但我的问题更具体, 这是代码:

#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返回的值只是一个随机值,还是有意义?

4 个答案:

答案 0 :(得分:6)

在编译时为大多数操作数评估sizeof运算符。对于VLA,它在运行时进行评估。

来自C standard的第6.5.3.4节:

  

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

因此sizeof返回的大小是VLA的字节大小。在您的示例中,这将是i * sizeof(int)

答案 1 :(得分:3)

sizeof返回的值是一个伪随机值,其含义为:

  • 该值表示VLA a的大小,以字节为单位
  • 只有通过调用rand确定数组元素的数量时才是随机的。

您系统上的sizeof(int)似乎是4,因为sizeof返回的数字是数组中元素数量的四倍。

注意:在C99中允许VLA的一个后果是sizeof不再是纯粹的编译时表达式。当sizeof运算符的参数是VLA时,结果将在运行时计算。

答案 2 :(得分:2)

  

sizeof返回的值只是一个随机值,还是有意义?

它确实有意义,74636 / 18659 = 4,显然是你机器上int的大小。

所以sizeof(由于参数是VLA,将在运行时而不是编译时计算)将以字节为单位返回数组a的大小,这是它包含的int(换句话说,i18659)乘以int的大小,即机器上的4

由于irand的结果)是随机的,因此您可以认为sizeof的值在这个意义上也是随机的。

答案 3 :(得分:2)

来自gcc manual

  

-ansi选项不会导致非ISO程序被无偿拒绝。为此,除了-ansi之外,还需要-Wpedantic。