Понимание поведения распределения памяти для массивов с использованием malloc

#c #malloc

Вопрос:

У меня есть этот простой код:

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

int main(){ 

int (*array)[2] = malloc(sizeof(int)*2);
    printf("%pn",array[0]); //0x13c606700
    printf("%pn",array[0] 1); //0x13c606704
    printf("%p", array[1]); //0x13c606708
}
 

Я использую malloc для выделения памяти для целочисленного массива из 2 элементов. Это возвращает указатель на указанный массив. Однако я не понимаю, почему array[0] 1 и array[1] выдаю разные адреса. array[0] 1 выводит адрес на array[0] 4, что ожидается, так как целое число имеет размер 4 байта. Но это не одно и то же для array[1] . Почему это происходит? Разве интуиция не подсказывает, что использование malloc в массиве фиксированного размера позволит программисту ссылаться на память, выделенную с использованием обозначения массива (т. е. массива[i])?

Комментарии:

1. Ваше заявление почти наверняка не то, чего вы хотите. Вы объявили указатель на массив из двух int. Обычно это используется для двумерного массива. Если вам просто нужен динамически выделяемый массив из двух int , объявление должно быть int *array . Вы можете использовать то, что у вас есть, для одномерного массива, но это необычно, и ваши ссылки должны выглядеть так, как будто (*array)[i] это не то, что вы делаете.

2. «Целочисленный массив из 2 элементов» int *array (должен быть выделен) или int array[2] . Для первого вам нужно int *array = malloc(sizeof *array * 2); , но затем данные в array[0] и array[1] неопределенны.

Ответ №1:

array[0] является ан int[2] . При передаче функции она распадается на указатель на первый элемент an int , который в вашей системе составляет 4 байта.

array[0] 1 добавляет sizeof(int) к указателю.

array[1] является следующим int[2] (за пределами). Это уже второй sizeof(int) раз.

Комментарии:

1. Если я могу спросить вас (и извиниться за мое незнание). Используя (*массив)[2], выделил ли я память для 2 x 1d массивов sizeof(int)*2 ? Имеется в виду 2 массива по 8 байт?

2. @Низар Нет, вы выделили место только для двух int s, так что это один int[2] .