答案 0 :(得分:19)
这是C99标准第6.5.2.5节中定义的复合文字。
它不是C ++语言的一部分,因此C ++编译器不编译它就不足为奇了。 (或Java或Ada编译器)
复合文字的值是由初始化的未命名对象的值 初始化列表。如果复合文字出现在函数体外,则为对象 有静态存储时间;否则,它有自动存储持续时间 封闭的块。
所以不,它不会破坏堆栈。编译器为对象分配存储空间。
括号是围绕类型放置的,然后是初始化列表 - 它不是强制转换,因为裸初始化列表在C99语法中没有意义;相反,它是一个后缀运算符,应用于产生给定类型的对象的类型。您没有创建{ 0, 3 }
并将其投射到数组,而是使用值0和3初始化int[2]
。
至于为什么使用它,我在单行中看不出它的好理由,尽管它可能被重新分配以指向其他一些数组,所以它是一个较短的方法来做第一个两行:
int default_a[] = { 0, 2 };
int *a = default_a;
if (some_test) a = get_another_array();
我发现将临时联合传递给函数
非常有用// fills an array of unions with a value
kin_array_fill ( array, ( kin_variant_t ) { .ref = value } )
答案 1 :(得分:6)
这是一个c99构造,称为复合文字。
从2005年5月的委员会草案第6.5.2.5节开始:
包含的后缀表达式 带括号的类型名称后跟 括号括起来的初始化器列表 是复合文字。它提供了一个 未命名的对象,其值由。给出 初始化列表。
...
示例1文件范围定义
int *p = (int []){2, 4};
初始化p 指向一个元素的第一个元素 两个整数的数组,第一个有 值二和二,四。 这个化合物中的表达式 字面值必须是常量。 未命名的对象具有静态存储 持续时间。
答案 2 :(得分:1)
int
s的数组分配空间。int
和0
填充两个2
的[数组]。int*
的局部变量,并为该变量分配两个int
的[数组]的地址。答案 3 :(得分:0)
(int [2])告诉编译器应将以下表达式转换为int [2]。这是必需的,因为{0,2}可以被转换为不同类型,例如long [2]。转换发生在编译时 - 而不是运行时。
整个表达式在内存中创建一个数组,并将a设置为指向此数组。
答案 4 :(得分:-2)
{0, 2}
是由0和2组成的数组的表示法。(int[2])
int * a =
将其分配给int指针a。