終端まで読まないと大きさがわからないデータファイルを
メモリ上に配列としてロードしたくてreallocを使おうと思ったのですが
(mallocしてreallocで領域を拡張しまくる)
reallocがうまく動きません
たとえば、
char *str = (char *)malloc(sizeof(char) * 8);
str = "foo";
printf("%s\n", str);
str = (char *)realloc(str, sizeof(char) * 16);
str = "foobarbaz";
printf("%s\n", str);
↓
fatalerror - called with threadlist_ix -1
Hangup
となってしまいます…gdbで調べたらSIGSEGVとかで
セグメンテーションフォールトのようです

質問1:reallocの使い方はこれで合っていますか?(環境はCygwin + gccです)

質問2:プログラムの最初において
大きさのわからないファイルを全部メモリ上にロードしておいて、
実行終了までfreeする可能性が全く無い場合、
しかもメモリ上には配列で持っておきたい場合に
reallocで領域を拡張するほかに
良い方法があればご教授いただけませんか?
以前mallocの実装を習ったときに聞いた
sbrkというシステムコールが使えそうなんですが…

以上二点、教えてください。お願いします。