什么是“int * a =(int [2]){0,2}};”到底怎么办?

时间:2010-06-11 14:44:44

标签: c

当我看到这个符号时,我感到非常惊讶。它是做什么的,它是什么样的C概念?

5 个答案:

答案 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)

  1. 在堆栈上为[两个int s的数组分配空间。
  2. 分别使用值int0填充两个2的[数组]。
  3. 声明类型为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。