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

时间:2014-02-19 13:53:28

标签: c struct compound-literals

使用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. 如果是这样的话:复合文字的生命周期是多少?

2 个答案:

答案 0 :(得分:8)

C99或以上的有效C.

  

C99§6.5.2.5复合文字

     

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

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

来自@Shafik Yaghmour的推荐阅读:

  1. The New C: Compound Literals
  2. GCC Manual: 6.25 Compound Literals

答案 1 :(得分:2)

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

每当你看到一个复合文字,如:

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;
}