Указывает ли это, что массив, на который указывает array_ptr
, хранится в куче?
Нет. array_ptr
не указывает ни на что, ни в стеке, ни в куче.
int (*array_ptr)[100];
array_ptr
- это один указатель на массив из 100 int
объектов, но с помощью этого оператора вы не создаете массив с 100 int
объектами, по которым array_ptr
указывает на первый элемент этого массива. Он создает только сам указатель.
С:
printf("array_ptr: %p \narray_ptr+1: %p\n", array_ptr, array_ptr+1);
Вы пытаетесь распечатать адреса объектов указателя array_ptr
и его смещение на 1 точку, но это не так Это возможно, поскольку array_ptr
не инициализируется, чтобы указывать на такие объекты. Таким образом, вы получите любой вид неопределенного поведения / непредсказуемые результаты.
Вам нужно инициализировать array_ptr
с, например, адресом первого int
объекта array
:
int (*array_ptr)[100] = array;
То же самое относится к указателю ptr
с:
printf("ptr: %p\n", ptr);
ptr
должен иметь адрес объекта, на который он указывает, чтобы показать адрес этого объекта.
Но динамически выделенный блок памяти, на который указывает buff
, также должен находиться в куче, и его значение изменяется, почему это так?
Это это совершенно другая вещь. С malloc
вы do выделяете память в куче (если она была успешной, конечно), и вы do получаете указатель на эту память обратно, что не имеет место с int (*array_ptr)[100];
.