使用运算符的大小初始化数组

Initializing an Array using Size of Operator?

本文关键字:初始化 数组 运算符      更新时间:2023-10-16

我有一个数组,我想初始化

char arr[sizeof(int)];

这个表达式的计算结果是编译时常数还是导致函数调用?

char arr[sizeof(int)];

就语言而言,这是可以的,尽管数组只是声明(和定义)的,但如果它是局部变量,则不会初始化。如果它是在命名空间级别声明的,那么它被静态地初始化为零。

注意,sizeof(int)size_t类型的常量表达式;它的值在编译时是已知的。

这是一个初始化:

  char arr[sizeof(int)] = { 'A', 'B', '0', 'F' };

当然,这是假设sizeof(int)(至少)是4,否则它将无法编译。

为了回答实际的(新的)问题:

sizeof()是一个编译时运算符。在C++中[根据标准,一些编译器确实允许使用C风格的可变长度数组],除了编译时间常数之外,它不会产生任何其他结果。在C中,对于可变长度的数组,它可以变成一个简单的计算(元素数量*每个元素的大小-其中元素数量是可变部分)。

此处没有初始化。用sizeof(int)元素声明或定义一个数组没有错,只是对代码的读者来说可能有点奇怪。但如果这是你需要的,那就是你应该写的。

这实际上取决于您打算如何使用数组。

sizeof(int)可能因不同的实现而有所不同,因此您只需要小心如何访问数组中的元素。不要假设在您的机器上可以访问的元素在另一台机器上也可以访问,除非它在C++标准中指定的最小大小范围内。

sizeof是在编译时计算的,运行时计算的唯一时间大小将是在C99代码中的可变长度数组的情况下,或者在gcc或其他支持VLA作为扩展的c++编译器中。所以这个代码是有效的:

char arr[sizeof(int)];

尽管如果它是局部变量,它不会被初始化。