La primera es mas rapida pero es muy arduo de utilizar, lo segundo necesita de dos lecturas en la memoria para cada 'read' or 'write' en el vector
Citar
/**
* Forma uno:
**/
int i = 0, j = 0;
int lineas = 5, columnas = 5;
int * matrix = (int *) malloc(sizeof(int) * lineas * columnas);
/* matrix[j] */
matrix[i * columnas + j] = 15;
/*
* Forma dos:
*/
int ** m2 = (int **) malloc(sizeof(int *) * lineas);
for (int i = 0; i < lineas; ++i)
m2 = (int *) malloc(sizeof(int) * columnas);
m2[j] = 15;
* Forma uno:
**/
int i = 0, j = 0;
int lineas = 5, columnas = 5;
int * matrix = (int *) malloc(sizeof(int) * lineas * columnas);
/* matrix[j] */
matrix[i * columnas + j] = 15;
/*
* Forma dos:
*/
int ** m2 = (int **) malloc(sizeof(int *) * lineas);
for (int i = 0; i < lineas; ++i)
m2 = (int *) malloc(sizeof(int) * columnas);
m2[j] = 15;