int (^b[3])();
for (int i=0; i<3; i++)
b[i] = ^{ return i;};
for (int i=0; i<3; i++)
printf("b %dn", b[i]());
最初のループでブロック構造が作成され、次に、この構造のアドレスがb [i]要素に割り当てられ、ブロック構造が破壊されます。質問は、2番目のループのb [i]がブロックの最後の状態への有効/同じポインターを含む理由です。要素が無効なスタック領域を指しているため、2番目のループがクラッシュすることが予想されます。
私はこれが最良のコードではないことを知っており、私はそれを使用していません。しかし、最初のループの後、ブロック構造が破壊されるはずのとき、有効なスタックオブジェクトを持っている理由を理解したいです。
回答:
回答№1は2コードは、それが作成されたスコープ外のブロックを使用しているため、未定義の動作を示します。代わりにこれを書く必要があります:
b[i] = [^{ return i; } copy];
変数は次の理由で問題を引き起こしません。const修飾子が追加されたブロックのスコープに実際にコピーされます。 __block
修飾子。参照ブロックがコピーされたときに変数をスタックからヒープに移動する(つまり、アドレスを変更する)奇妙な副作用があります。