GCC's extensions allow you to do some crazy things with multidimensional arrays. For C99, GCC implements variable-length arrays. So a declaration like this:
int matrix[a][b + 1];
Can be passed by reference to a function with this prototype:
void foo(int a, int b, int matrix[a][b+1]);
Or, if you want to get really crazy, you can use forward declarations and change around the parameter order:
void foo(int a; int b; int matrix[a][b+1], int a, int b);
No malloc needed! Much better than the old way.