Ist es sicher, einen Heap-zugewiesenen Zeiger auf einen Zeiger auf eine VLA zu werfen?

Wenn ich einen Zeiger auf einen Heap-zugewiesenen Speicherplatz habe, der ein typisches zweidimensionales Array mit Zeilensprung darstellt, ist es sicher, diesen Zeiger für eine bequeme Skripterstellung auf einen entsprechenden Zeiger auf eine VLA zu setzen? Beispiel:

//
// Assuming 'm' was allocated and initialized something like:
//
// int *matrix = malloc(sizeof(*matrix) * rows * cols);
//
// for (int r = 0; r < rows; r++) {
//     for (int c = 0; c < cols; c++) {
//         matrix[r * cols + c] = some_value;
//     }
// }
//
// Is it safe for this function to cast 'm' to a pointer to a VLA?
//
void print_matrix(int *m, int rows, int cols) {
    int (*mp)[cols] = (int (*)[cols])m;

    for (int r = 0; r < rows; r++) {
        for (int c = 0; c < cols; c++) {
            printf(" %d", mp[r][c]);
        }
        printf("\n");
    }
}

Ich habe den obigen Code getestet. Es scheint zu funktionieren und es macht für mich Sinn, dass es funktionieren sollte, aber ist es sicheres, definiertes Verhalten?

Für den Fall, dass sich jemand wundert, ist der Anwendungsfall, dass ich Daten aus einer Datei / einem Socket / usw. erhalte, die ein reihengroßes 2D- (oder 3D-) Array darstellen, und VLAs verwenden möchte, um die manuelle Berechnung von Indizes zu vermeiden Elemente.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage