int a[N][N];
って宣言したらスタック上に確保されるだろうが。
どうしてcallocが関係あるんだ?