2

基于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;
4

0 回答 0