#include #include // max total size of statically allocated arrays is platform-dependent // (platform = OS + hardware, so Linux+Intel or macOs+Mac or Android+ARM) #define MAX_STATIC 1000000 int sum2D(int w, int h, int arr[][w]); // a function that takes an int and returns a pointer to an x-by-4 array // that 4 must be a constant expression, though int (*make2D(int n))[4]; /** * An example of dynamically allocated rectangular 2-D arrays. */ int main(int argc, char *argv[]) { // [Bill & Ted voice] WHOA! int h = 3; int w = 4; int (*arr)[w]; // a pointer to an x-by-w array (x can be anything) arr = malloc(sizeof(int) * w * h); for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { arr[i][j] = i + j; } } printf("arr = %p\n", arr); printf("&arr = %p\n", (void *)&arr); printf("arr[0] = %p\n", arr[0]); printf("arr[1] = %p\n", arr[1]); printf("arr[2] = %p\n", arr[2]); printf("sum2D(arr) = %d\n", sum2D(w, h, arr)); free(arr); int (*a2)[4] = make2D(6); printf("sum2D(a2) = %d\n", sum2D(4, 6, a2)); free(a2); } int sum2D(int w, int h, int arr[][w]) { int sum = 0; for (int r = 0; r < h; r++) { for (int c = 0; c < w; c++) { sum += arr[r][c]; } } return sum; } int (*make2D(int n))[4] { int (*arr)[4] = malloc(sizeof(int) * n * 4); for (int r = 0; r < n; r++) { for (int c = 0; c < 4; c++) { arr[r][c] = r + c; } } return arr; }