C中动态分配数组的大小
the size of dynamically allocated array in C
我知道以前有人问过这个问题,但我的问题更具体,
这是代码:
#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 返回的值只是一个随机值,还是有意义的?
is the value returned by sizeof is just a random value, or it has a meaning?
它确实有一个含义,如 74636
/ 18659
= 4
,这显然是您机器上 int
的大小。
因此 sizeof
(由于参数是 VLA,将在 运行 时而不是编译时计算),return 数组的大小 a
以字节为单位,这是它包含的 int
的数量(换句话说 i
或 18659
)乘以 int
的大小,即 4
在你的机器上。
因为i
(rand
的结果)是随机的,你可以认为sizeof
的值在这个意义上也是随机的。
sizeof
返回的值是一个伪随机值,其含义为:
- 该值表示 VLA
a
的大小,以字节为单位
- 它是随机的,只是因为数组元素的数量是由调用
rand
. 决定的
您系统上的 sizeof(int)
似乎是 4,因为 sizeof
返回的数字是数组中元素数量的四倍。
注意: 在 C99 中允许 VLA 的后果之一是 sizeof
不再是纯粹的编译时表达式。当 sizeof
运算符的参数是 VLA 时,结果在 运行 时计算。
对于大多数操作数,sizeof
运算符在编译时求值。在 VLA 的情况下,它是在运行时评估的。
来自 C standard 的第 6.5.3.4 节:
2 The sizeof
operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type. The
size is determined from the type of the operand. The result is an
integer. If the type of the operand is a variable length array type,
the operand is evaluated; otherwise, the operand is not evaluated and
the result is an integer constant
所以sizeof
返回的大小就是VLA的字节大小。在您的示例中,那将是 i * sizeof(int)
The -ansi option does not cause non-ISO programs to be rejected gratuitously. For that, -Wpedantic is required in addition to -ansi.
我知道以前有人问过这个问题,但我的问题更具体, 这是代码:
#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 返回的值只是一个随机值,还是有意义的?
is the value returned by sizeof is just a random value, or it has a meaning?
它确实有一个含义,如 74636
/ 18659
= 4
,这显然是您机器上 int
的大小。
因此 sizeof
(由于参数是 VLA,将在 运行 时而不是编译时计算),return 数组的大小 a
以字节为单位,这是它包含的 int
的数量(换句话说 i
或 18659
)乘以 int
的大小,即 4
在你的机器上。
因为i
(rand
的结果)是随机的,你可以认为sizeof
的值在这个意义上也是随机的。
sizeof
返回的值是一个伪随机值,其含义为:
- 该值表示 VLA
a
的大小,以字节为单位 - 它是随机的,只是因为数组元素的数量是由调用
rand
. 决定的
您系统上的 sizeof(int)
似乎是 4,因为 sizeof
返回的数字是数组中元素数量的四倍。
注意: 在 C99 中允许 VLA 的后果之一是 sizeof
不再是纯粹的编译时表达式。当 sizeof
运算符的参数是 VLA 时,结果在 运行 时计算。
对于大多数操作数,sizeof
运算符在编译时求值。在 VLA 的情况下,它是在运行时评估的。
来自 C standard 的第 6.5.3.4 节:
2 The
sizeof
operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type. The size is determined from the type of the operand. The result is an integer. If the type of the operand is a variable length array type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an integer constant
所以sizeof
返回的大小就是VLA的字节大小。在您的示例中,那将是 i * sizeof(int)
The -ansi option does not cause non-ISO programs to be rejected gratuitously. For that, -Wpedantic is required in addition to -ansi.