> unsigned char hoge; //hogeは可変長

ここがキモなのかな。これで可変長というのは信じられないから、
実際は unsigned char hoge[0];というところなんではないか?