#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)