Der andere Ansatz wäre, einen zusammenhängenden Speicherblock zuzuweisen, der einen Headerblock für Zeiger auf Zeilen sowie einen Bodyblock zum Speichern tatsächlicher Daten in Zeilen umfasst. Markieren Sie dann einfach den Speicher, indem Sie den Zeigern im Header pro Zeile Adressen des Speichers im Body zuweisen. Es würde wie folgt aussehen:
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() {
int columns[] = {1,2,3};
int rows = sizeof(columns)/sizeof(int);
int** matrix = 2dAlloc(rows, &columns);
for(int i = 0; i<rows; ++i) {
for(int j = 0; j<columns[i]; ++j) {
cout<<matrix[i][j]<<", ";
}
cout<<endl;
}
free matrix;
}
Der Vorteil dieses Ansatzes ist die elegante Speicherfreigabe und die Möglichkeit, mithilfe der Array-ähnlichen Notation auf Elemente des resultierenden 2D-Arrays zuzugreifen.