Указатель на смежный 2D массив

Я использую gcc версии 4.8.0 с флагами-Wall -std=gnu99.

Мне нужно динамически распределять память для непрерывного 2D-массива, используя malloc в C; этот факт не подлежит обсуждению. Тем не менее, для простоты использования я все еще хочу иметь возможность доступа к массиву с помощью удобногоx[r][c] нотации. Вот моя отважная попытка создать указатель на непрерывный 2D-массив и проиндексировать массив, выполнив*array[r][c]:

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

int main(void)
{
    size_t rows = 3, cols = 5;

    printf("sizeof(int) = %li\n\n", sizeof(int));

    int (*array)[rows][cols] = malloc(sizeof(int) * rows * cols);
    printf("array starts at %p\n", array);
    printf("sizeof(array) = %li\n", sizeof(array));
    printf("sizeof(array[0][0]) = 0x%lx\n", sizeof(array[0][0]));
    puts("");

    unsigned short r, c;

    for (r = 0; r <= rows - 1; r++) {
        for (c = 0; c <= cols - 1; c++) {
            printf("array[%i][%i] is at %p\n", r, c, &(*array[r][c]));
        };
        puts("");
    };
}

Хотя он компилируется без предупреждений, он имеет неожиданный вывод:

sizeof(int) = 4

array starts at 0x16cc010
sizeof(array) = 8
sizeof(array[0][0]) = 0x14

array[0][0] is at 0x16cc010
array[0][1] is at 0x16cc024
array[0][2] is at 0x16cc038
array[0][3] is at 0x16cc04c
array[0][4] is at 0x16cc060

array[1][0] is at 0x16cc04c
array[1][1] is at 0x16cc060
array[1][2] is at 0x16cc074
array[1][3] is at 0x16cc088
array[1][4] is at 0x16cc09c

array[2][0] is at 0x16cc088
array[2][1] is at 0x16cc09c
array[2][2] is at 0x16cc0b0
array[2][3] is at 0x16cc0c4
array[2][4] is at 0x16cc0d8

Я не очень понимаю, что здесь происходит. Элементы являются смежными, но они слишком велики для целых, а массив слишком мал, чтобы вместить их все.

Моя декларация массива - часть, в которой я больше всего не уверен - я читаюint (*array)[rows][cols] как "array указатель на массив (с шагомcols)), но, по-видимому, это неверно.

Что именно я здесь делаю не так?

Ответы на вопрос(2)

Ваш ответ на вопрос