問題
下記のコードで、Hello
とWorld
のどちらが出力されるのか考えてみてください。
場合によってはメモリリークしますが、とにかく標準出力に出てくるのは何かだけ考えてみてください。
出力されるのはHelloなのかWorldなのか
#include <stdio.h>
#include <stdlib.h>
static int* g_i = NULL;
static void PutsSomething() {
if (g_i == NULL) {
g_i = (int*)malloc(sizeof(*g_i));
puts("Hello");
} else {
puts("World");
}
}
int main(void) {
g_i = NULL;
PutsSomething();
// free(g_i);
return EXIT_SUCCESS;
}
動作確認結果
コンパイラ | 最適化レベル | 出力結果 |
---|---|---|
gcc7.2 x86-64 | -O0 | Hello |
gcc7.2 x86-64 | -O1 | Hello |
gcc7.2 x86-64 | -O2 | Hello |
clang5.00 x86-64 | -O0 | Hello |
clang5.00 x86-64 | -O1 | World |
clang5.00 x86-64 | -O2 | World |
どうしてこうなった
分からない。
ちなみにfree()
を書けばHelloが出力される。分からない。
参考
clangのアセンブラ出力確認
- Clang初級 - Qiita
https://qiita.com/megane814/items/ef3f4f44eae31e0560a0 - 超便利!C言語のアセンブラ出力を即確認できるサイト|compiler-explorer
http://nagayasu-shinya.com/clang-compiler-exploerore/- Compiler Explorer - C++
https://gcc.godbolt.org/#
- Compiler Explorer - C++
動作確認環境
- [Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ
https://wandbox.org/
どうやらclang-6.00でも起きる模様。