allocってなんぞや

「欲しいサイズのメモリを使えるようにする」という意味では、ほとんど差が無い のですが、その用意の仕方が違います。

変数で宣言する場合には、あらかじめソースを書く段階で、型とその大きさ(配列の 個数)が決っていなければなりません。

それだけで、不自由が無ければそれで良いのですが、実際には、プログラムを動かして いるときに、初めてその大きさが決まり、そのサイズのメモリが欲しい、というときが あります。

その場合には alloc 系の関数を使うしかないです。

と言いつつも、新しい C の規格(C99)では、alloc 系の関数を使わなくても、大きさを 後から決められる配列が使えたりします。

こんなソースがかけちゃう!
int size;
scanf("%d", &size);

int data[size]; /* おおっと! */

/* 今までの C では、こう書くしかなかったんです。
int size;
int *data;

scanf("%d", &size);

data = malloc(size * sizeof(int));
*/

後、細かいことを言うと、変数の宣言で用意されるメモリの場所と、alloc 系の関数で 用意される場所が微妙に(それぞれの中でもやり方によって)違います。
まあ、このあたりは、もっと突っ込んだことをやるようになってから覚えてもいいでしょう。