C中动态分配数组的大小[重复]

5ssjco0h  于 2023-04-05  发布在  其他
关注(0)|答案(4)|浏览(151)

此问题在此处已有答案

Behavior of sizeof on variable length arrays (C only)(2个答案)
5年前关闭。
我知道这个问题以前有人问过,但我的问题更具体,下面是代码:

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

kqlmhetl

kqlmhetl1#

sizeof运算符在编译时对大多数操作数求值。对于VLA,它在运行时求值。
来自6.5.3.4C standard的www.example.com部分:

  • 2***sizeof运算符产生其操作数的大小(以字节为单位)**,可以是表达式,也可以是类型的括号名,大小由操作数的类型决定,结果为整数。如果操作数的类型为变长数组类型,则计算操作数;否则,不计算操作数,结果为整数常量

因此,sizeof返回的大小是VLA的字节大小。

cunj1qz1

cunj1qz12#

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

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

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

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

uelo1irk

uelo1irk3#

来自gcc手册
-ansi选项不会导致非ISO程序被拒绝。为此,除了-ansi之外,还需要-Wpedantic。

yquaqz18

yquaqz184#

sizeof返回的值是一个随机值,还是有意义的?
它确实有一个含义,如74636/18659 = 4,这显然是您机器上int的大小。
因此sizeof(由于参数是VLA,因此将在运行时而不是编译时计算)将返回数组a的字节大小,即它包含的int的数量(换句话说,i18659)乘以int的大小,在您的机器上为4
由于irand的结果)是随机的,因此可以认为sizeof的值也是随机的。

相关问题