El otro enfoque sería asignar un trozo contiguo de memoria que comprende bloque de cabecera para los punteros a las filas, así como bloque de cuerpo para almacenar datos reales en filas. A continuación, simplemente marque la memoria asignando direcciones de memoria en el cuerpo a los punteros en el encabezado por fila. Se vería como sigue:
int** 2dAlloc(int rows, int* columns) {
int header = rows * sizeof(int*);
int body = 0;
for(int i=0; i<rows; body+=columnSizes[i++]) {
}
body*=sizeof(int);
int** rowptr = (int**)malloc(header + body);
int* buf = (int*)(rowptr + rows);
rowptr[0] = buf;
int k;
for(k = 1; k < rows; ++k) {
rowptr[k] = rowptr[k-1] + columns[k-1];
}
return rowptr;
}
int main() {
// specifying column amount on per-row basis
int columns[] = {1,2,3};
int rows = sizeof(columns)/sizeof(int);
int** matrix = 2dAlloc(rows, &columns);
// using allocated array
for(int i = 0; i<rows; ++i) {
for(int j = 0; j<columns[i]; ++j) {
cout<<matrix[i][j]<<", ";
}
cout<<endl;
}
// now it is time to get rid of allocated
// memory in only one call to "free"
free matrix;
}
La ventaja de este enfoque es elegante liberación de la memoria y la capacidad de utilizar la notación de matriz similar a acceder a los elementos de la matriz 2D resultante.
Si asigna N * M bytes en una sola operación, entonces llena todos los c [i] s manualmente: c [i] = p + M * i; –
Eso depende del tipo de c - si es char **, entonces sí, si es char *, entonces la indexación cambia: elemento [i] [j] ~ c [i * M + j]. –
@Nikolai N Fetissov, hay muchos mallocs en el código, ¿cómo puede esto liberarse? usando también bucles for? – e19293001