dynamic 2d arr in c

#include <stdio.h>
#include <stdlib.h>

int main() {
    int rows, cols;
    printf("Enter the number of rows: ");
    scanf("%d", &rows);
    printf("Enter the number of columns: ");
    scanf("%d", &cols);

    int arr = (int )malloc(rows  sizeof(int ));
    for (int i = 0; i < rows; i++) {
        arr[i] = (int )malloc(cols  sizeof(int));
    }

    // Accessing and setting values
    arr[0][0] = 1;
    arr[1][2] = 5;

    // Freeing memory
    for (int i = 0; i < rows; i++) {
        free(arr[i]);
    }
    free(arr);

    return 0;
}