Я не могу себе представить, что это еще не дублирует, но я не могу легко найти ответ, поскольку более сложные сценарии, специфичные для C++, как представляется, доминируют в обсуждении .Принимая адрес временного (составного литерала) в C
Является ли законным принимать адрес временного, построенного в списке параметров вызова функции в C99?
Например, что-то вроде init_list
или init_desig_init
следующим образом:
typedef struct {
int x;
int y;
} point_t;
int manhattan(point_t *p) {
return p->x + p->y;
}
int init_list() {
return manhattan(&(point_t){1, 2});
}
int init_desig_init() {
return manhattan(&(point_t){.x = 1});
}
Большой три seem to compile it OK, но я не мог на самом деле найти ссылку объясняя, что срок службы временно будет продлен на как минимум через вызов функции.
Как выясняется, на основе ответа по ММ ниже, часть моих вопросов поиска был, потому что я искал информацию о временных, в то время как правильный термин C для этого конкретного конструкция инициализации - соединение буква.
Я бы назвал это «большой кросс-платформенный три» действительно, в знак уважения к MSVC, но на самом деле я просто имею в виду «поддерживающие крепители C-компиляторов».
Ответ вы получили это хорошо, но есть немного Понял, что стоит иметь в виду, когда вы более активно используете сложные литералы: http://stackoverflow.com/questions/34880638/compound-literal-lifetime-and-if-blocks – Art
@Art - очень хорошая точка. Поскольку это, если еще не было достаточно, чтобы вспомнить разные правила жизни для сложных литералов в C по сравнению с временными в C++ ... – BeeOnRope