我有一个我想初始化的数组
char arr[sizeof(int)];
此表达式是否会计算编译时常量或导致函数调用?
答案 0 :(得分:4)
char arr[sizeof(int)];
就语言而言,它很好,虽然数组只是声明(和定义),但如果它是局部变量则不会初始化。如果在命名空间级别声明它,那么静态零初始化。
请注意sizeof(int)
是size_t
类型的常量表达式;它的值在编译时是已知的。
答案 1 :(得分:0)
这里没有初始化。声明或定义具有sizeof(int)
元素的数组没有任何问题,除了对于代码的读者来说可能看起来有些奇怪。但如果这就是你所需要的,那就是你应该写的东西。
答案 2 :(得分:0)
这是初始化:
char arr[sizeof(int)] = { 'A', 'B', '0', 'F' };
这当然假设sizeof(int)
是(至少)4,否则将无法编译。
回答实际(新)问题:
sizeof()
是一个编译时运算符。在C ++中[根据标准,一些编译器允许使用C样式的可变长度数组],除了编译时间常量之外,它不会产生任何结果。在C中,使用可变长度数组,它可以变成一个简单的计算(元素的数量*每个元素的大小 - 其中元素的数量是可变部分)。
答案 3 :(得分:0)
这实际上取决于你打算如何使用数组。
sizeof(int)
可能因不同的实现而有所不同,因此您只需要小心如何访问数组中的元素。不要假设您的机器上可以访问的元素可以在另一个元素上访问,除非它在C ++标准中指定的最小大小之内。
答案 4 :(得分:0)
sizeof
在编译时进行评估,sizeof将在variable length arrays in C99
代码或gcc
或其他c ++编译器支持{{}}的情况下进行运行时的唯一时间{3}}。所以这段代码是有效的:
char arr[sizeof(int)];
虽然如果它是局部变量,它将不会被初始化。