Это просто совпадение; стек не очищается при разрушении области цикла for (). Массив не содержит блоков, он содержит ссылки на, теперь уже не существующий, блочный слот в стеке в цикле for (). Если бы вы скомпилировали это с оптимизацией (или использовали функцию чистого стека GC), вы бы, вероятно, увидели другое [неопределенное] поведение.

ю, что блоки создаются в стеке. Однако, поскольку у меня недостаточно знаний о стеке и локальных переменных, я не могу понять, почему я должен переместить блок в кучу, чтобы получить ожидаемый результат. Интуитивно я чувствую, что блок кода блока имеет только 1 экземпляр в стеке, этот код ссылается на локальную переменнуюi три раза. Если я скопирую его в кучу, у него будет 3 разных экземпляра, и каждый раз он будет захватывать 3 разных значенияi во время процедуры копирования. Но мне бы очень хотелось узнать больше о блочном коде в стеке, куче и ссылках на локальные переменные.

for (int i=0; i<3; i++)
    b[i] = ^{ return i;};
for (int i=0; i<3; i++)
    printf("b %d\n", b[i]());

Ответы на вопрос(1)

Ваш ответ на вопрос