使用运算符的大小初始化数组
Initializing an Array using Size of Operator?
我有一个数组,我想初始化
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)];
尽管如果它是局部变量,它不会被初始化。
相关文章:
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 在函数内部的声明中初始化数组,并在外部使用它
- 为什么用结构初始化数组需要指定结构名称
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- C++使用另一个数组和新值初始化数组
- 初始化数组、"memset"或" {//value} "的最佳方法是什么?
- 在 constexpr 构造函数中初始化数组是否合法?
- 我可以初始化 const 实例,以便我可以将其用作 const 来初始化数组吗?
- 在构造函数中初始化数组
- 是否可以使用函数返回的值初始化数组
- 使用宏使用额外元素初始化数组
- 在循环中显示不同值的初始化数组
- 如何在macOS中的旧扩展clang和gcc编译器中初始化数组和向量
- 使用可变模板列表初始化数组,并放置new
- 使用函数从 Visual Studio 2017 中的 main 创建和初始化数组
- 使用 c++ 中的函数初始化数组
- 这是使用构造函数初始化数组对象的最佳方法吗?
- C++ 使用变量而不是常量表达式初始化数组
- 在初始化列表中初始化数组的更好方法
- 在可变参数模板类中初始化数组