回答編集履歴
1
VLAのコードが大きさ0の配列を生成しており、未定義な動作になっていた。
answer
CHANGED
@@ -7,14 +7,14 @@
|
|
7
7
|
{
|
8
8
|
for (int i = 0; i < 10; i++) {
|
9
9
|
int x;
|
10
|
-
int y[i];
|
10
|
+
int y[i + 1];
|
11
11
|
int z[i + 2];
|
12
12
|
printf("%d: %p, %p, %p\n", i, (void *)&x, (void *)y, (void *)z);
|
13
13
|
}
|
14
14
|
}
|
15
15
|
```
|
16
16
|
|
17
|
-
[Wandboxでの実行結果](https://wandbox.org/permlink/
|
17
|
+
[Wandboxでの実行結果](https://wandbox.org/permlink/KVFwuJkuIyG2UAJF)
|
18
18
|
※ GCCなどVLAが使用できるコンパイラで最適化無し(`-O0`)で実行してください。
|
19
19
|
|
20
20
|
領域は一つのループに対して、開始する度に確保され、終了する度に開放されますが、解放された領域は再び使用可能であるため、通常は次のループでも同じ領域を確保します。しかし、VLAのような取得する大きさが毎回異なる場合は、その大きさに合わせて確保される領域もずれていくことになります。
|