str = malloc(sizeof(str) * num);
は明らかに変だな。
str = malloc(sizeof(char *) * num);
とかすればいいのか?意味的に。
(ポインタのサイズはどうせ同じだろうけど・・・)

いろいろ、突っ込んでいただけると助かります。