gcc и clang не выдают предупреждение при возврате указателя на составной литерал - PullRequest
0 голосов
/ 27 октября 2018

На основе объяснения 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;
...