【问题标题】:Initializing a pointer to compound literals in C在 C 中初始化指向复合文字的指针
【发布时间】: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


【解决方案1】:

是的,有一个指向复合文字的指针是有效的。标准允许这样做。

n1570-§6.5.2.5 (p8):

示例 1 文件范围定义

int *p = (int []){2, 4};

初始化p 指向一个由两个整数组成的数组的第一个元素,第一个元素的值为2,第二个元素为4。此复合文字中的表达式必须是常量。 未命名的对象 具有静态存储持续时间

【讨论】:

  • 请注意,该示例是针对文件范围的,但此初始化程序在函数范围内,因此它甚至不必具有常量值...
  • @AnttiHaapala;同意。在C标准中提到它只是为了演示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 2017-11-03
相关资源
最近更新 更多