C 2018 6.5.2.5 5 говорит, что составной литерал внутри функции имеет автоматическое c срок хранения:
… Если составной литерал находится вне тела функции, объект имеет срок хранения c; в противном случае он имеет автоматическую c продолжительность хранения, связанную с вмещающим блоком.
Это означает, что память зарезервирована для составного литерала с момента, когда выполнение программы достигает своего объявления, пока не завершится выполнение вмещающего блока .
Когда код написан:
int main(void)
{
…
insert(&(struct node){.data = 1, .next = NULL});
insert(&(struct node){.data = 2, .next = NULL});
insert(&(struct node){.data = 3, .next = NULL});
print();
}
, тогда включающий блок - это { … }
, который формирует тело main
, и составные литералы существуют до выполнения main
заканчивается. Таким образом, они все еще существуют (то есть для них зарезервировано хранилище для каждого из них), пока print
выполняется).
В этом коде:
for(int i = 1; i < 4; i++){
insert(&(struct node){.data = i, .next = NULL});
}
включающий блок является { … }
это тело для l oop. Выполнение этого блока заканчивается каждый раз, когда итерация for
l oop. Таким образом, когда позже вызывается подпрограмма print
, ни один из этих составных литералов больше не существует (хранилище не зарезервировано ни для одного из них, и, вероятно, оно повторно использовалось для каждого из них последовательно).