#include <vector> #include <cstdio> using namespace std; vector<int> x; int hoge() { for (int i = 0; i < 4; i++) x.push_back(i); return 4; } int main() { x.push_back(2); x[0] = hoge(); printf("%d\n", x[0]); return 0; }
このソースコードの出力結果は実は不定である.gcc でコンパイルし実行した場合の多くは,プログラマーの直感に反して 2 が出力される.これは vector が可変長の配列変数であることに起因する.
可変長変数の実現には内部的には realloc (またはその類の関数) を用いているため,状況によってはメモリの再配置が行う必要が生まれる.gcc では代入演算子 “=” は左側を先に評価する.そのため,代入するメモリ位置を決定した後に,hoge 関数の評価を行う.しかし,hoge 関数内では x に対して push_back が行われ,メモリの再配置が起きるため,再配置前の x[0] のメモリ位置に 4 を代入することとなり,2 が出力される結果となる.
(出典: twitter.com)
