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

问题描述 投票:0回答:4

我知道以前有人问过这个问题,但我的问题更具体, 这是代码:

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

arrays c sizeof c89 ansi-c
4个回答
6
投票

sizeof
运算符在大多数操作数的编译时求值。在 VLA 的情况下,它是在运行时评估的。

来自C标准的第6.5.3.4节:

2

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

所以

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


3
投票

sizeof
返回的值是一个伪随机值,它有一个含义:

  • 值表示VLA的大小
    a
    ,单位为字节
  • 仅在数组元素的数量由对
    rand
    的调用确定的意义上是随机的。

您系统上的

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

注意: 在 C99 中允许 VLA 的后果之一是

sizeof
不再是纯粹的编译时表达式。当
sizeof
运算符的参数是 VLA 时,结果在运行时计算。


2
投票

来自gcc手册

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


2
投票

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

它确实有一个含义,如

74636
/
18659
=
4
,这显然是您机器上
int
的大小。

所以

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

由于

i
rand
的结果)是随机的,你可以认为
sizeof
的值在这个意义上也是随机的。

© www.soinside.com 2019 - 2024. All rights reserved.