【发布时间】:2017-10-04 05:23:31
【问题描述】:
这是一种不常见的初始化指针的方法:
int *p = (int[10]){[1]=1};
这里,指针指向复合文字。
#include <stdio.h>
int main(void)
{
int *p = (int[10]){[1]=1};
printf("%d\n", p[1]);
}
输出:
1
此程序在 G++ 编译器中编译并运行良好。
所以,
这是初始化指向复合文字的指针的正确方法吗?或
是未定义的行为初始化指向复合字面量的指针吗?
【问题讨论】:
-
你可以初始化它:
int p[10];,然后设置p[1] = 1(如果你编码干净的话) -
它不是“匿名数组元素”,而是恰好是数组的“复合文字”。让我们另外问一下:有没有any 方法来使用像这样的compound literal 而无需将其转换为指针?不,唯一的问题是复合文字的生命周期。
-
"初始化指针的方法是否正确?"取决于你想用它做什么。该代码 100% 等同于
int arr[10] = {[1]=1}; int* p = arr;。如果您想要一个具有本地范围的数组,则两者都可以。
标签: c pointers compound-literals