c - "int *a = (int[2]){0, 2};"究竟是做什么的?

标签 c

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

最佳答案

这是 C99 标准第 6.5.2.5 节中定义的复合文字。

它不是 C++ 语言的一部分,因此 C++ 编译器不编译它也就不足为奇了。 (或 Java 或 Ada 编译器)

复合文字的值是由 初始化列表。如果复合文字出现在函数体之外,则对象 具有静态存储期限;否则,它具有与关联的自动存储持续时间 封闭 block 。

所以不,它不会破坏堆栈。编译器为对象分配存储空间。

括号放在类型周围,然后是一个初始化列表——它不是强制转换,因为一个简单的初始化列表在 C99 语法中没有意义;相反,它是应用于产生给定类型对象的类型的后缀运算符。您不是在创建 { 0, 3 } 并将其转换为数组,而是在用值 0 和 3 初始化 int[2]


至于为什么使用它,我在你的单行中看不到一个很好的理由,尽管它可能是 a 可以被重新分配以指向其他数组,所以这是第一个的较短方法两行:

int default_a[] = { 0, 2 };
int *a = default_a;

if (some_test) a = get_another_array();

我发现它对于将临时 union 传递给函数很有用

// fills an array of unions with a value
kin_array_fill ( array, ( kin_variant_t ) { .ref = value } )

关于c - "int *a = (int[2]){0, 2};"究竟是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3023738/

相关文章:

c - 如何在 C 中定义全局变量 "struct"

c - 如何创建一个程序/命令来搜索文件中 "Real"的每个实例,然后将其替换为 "double."

c - 混合写入 stdout 和调用 WriteConsole 是否总是以相同的顺序打印到控制台?

c、创建线程和线程函数

c - 是否通过强制转换为已签名的未定义行为来检测未签名的环绕?

c++ - 确定重定向套接字打开请求的预期 IP 的 POSIX 调用是什么?

CodeChef 上的切割食谱练习

可变长度的字符

c - 如何将数组作为参数列表传递给 C 中具有不同数量参数的函数

c - 无需复制粘贴即可实现不同但相似的结构/功能集