基于https://en.cppreference.com/w/c/language/compound_literal的解释:
如果复合文字出现在文件范围内,则复合文字评估的未命名对象具有静态存储持续时间;如果复合文字出现在块范围内,则具有自动存储持续时间(在这种情况下,对象的生命周期在封闭块的末尾结束)。
但是这段代码在 gcc 和 clang 中编译(和工作)都很好,没有警告(所有警告都打开):
#include <stdio.h>
typedef struct {int first; int second;} int_pair;
static int_pair *pair(int a, int b)
{
return &(int_pair){a, b};
}
int main(void)
{
int_pair *x = pair(1, 2);
printf("%d %d\n", x->first, x->second);
return 0;
}
据我了解,这段代码与以下代码相同:
static int_pair *pair(int a, int b)
{
int_pair x = {a, b};
return &x;
}
返回:
warning: function returns address of local variable [-Wreturn-local-addr]
return &x;