作为参数传递的复合文字的生命周期是多少?

这使用clang编译时没有警告。

typedef struct { int option; int value; } someType; someType *init(someType *ptr) { *ptr = (someType) { .option = ptr->option | ANOTHEROPT, .value = 1 }; return ptr; } int main() { someType *typePtr = init( &(someType) { .option = SOMEOPT }); // do something else with typePtr } 
  1. 这甚至是有效的C吗?

  2. 如果是这样的话:复合文字的生命周期是多少?

它是C99或以上的有效C.

C99§6.5.2.5 复合文字

复合文字的值是初始化列表初始化的未命名对象的值。 如果复合文字出现在函数体外,则该对象具有静态存储持续时间; 否则,它具有与封闭块相关的自动存储持续时间。

在您的示例中,复合文字具有自动存储,这意味着它的生命周期在其块内,即它所在的main()函数。

来自@Shafik Yaghmour的推荐阅读:

  1. 新C:复合文字
  2. GCC手册:6.25复合文字

俞昊已经回答了标准,现在有些庸俗化了。

每当你看到像这样的复合文字:

 struct S *s; s = &(struct S){1}; 

你可以用以下代替它:

 struct S *s; struct S __HIDDEN_NAME__ = {1}; s = &__HIDDEN_NAME__; 

所以:

 struct S {int i;}; /* static: lives for the entire program. */ struct S *s = &(struct S){1}; int main() { /* Lives inside main, and any function called from main. */ s = &(struct S){1}; /* Only lives in this block. */ { s = &(struct S){1}; } /* Undefined Behavior: lifetime has ended. */ s->i; }