ポインタとmallocで変数の配列を動的確保して使う場合について。
プログラムの進行に応じて、データはそのままで配列の個数を再設定して使う方法はありますか?

int* nums;
nums=(int*)malloc(10);
上の定義ののち、

nums=(int*)malloc(20);
という処理をすると、元とは別の場所に領域を確保されてしまい、
元のデータは読めなくなってしまいます。

int型に限らず(doubleやcharやその他構造体でも)、プログラムの進行によって何件あるか不確定な、
途中で何件でも増加する可能性のあるデータを確保する変数を扱いたいのです。

課題で作れと言われてるのが、学校の全学生のデータを管理するプログラムで、
学生1名のデータ(氏名、身長、体重、成績などなど)を格納する構造体をつくり、それを全学生数分の配列で扱い、
学生情報の追加・削除の機能を持ち、ファイルからの読み出し/書き込みの機能も持つ・・・というもの。

読み込むファイルによって学生数が10人だったり1000人だったりする可能性がある上に、
「追加」の機能で学生数はいくらでも増やすことが可能。
ファイルを読み込んだ時点で、最初に動的確保して配列を定義、ここまではOKとして。
ファイルからもらった人数+α分の配列を作るようにしたとしても、
もしプログラム上でそれを超える人数が追加されたら、壊れてしまいます。
できれば1件追加するごとに配列を1件ずつ拡大のようにできればいいのですが。

何か手段無いですか?
長文すみません