Синтаксис *(a + index)
эквивалентен a[index]
; последний более четко указывает на ваше намерение с кодом.
Если мы разберем то, что вы делаете, со строками index++
(в вашем объявлении цикла for
) и a++
в теле вашего цикла, вы заметите, что обращаетесь к памяти, которую вы не делали ' т фактически выделить на a
:
Итерация цикла # 0 (a = индекс выделенного адреса = 0):
*(a + index) accesses a[0]
a[0] a[1] a[2] a[3] a[4]
0 ? ? ? ?
Итерация цикла # 1 (a = alloc + 1 index = 1):
*(a + index) accesses a[2]
a[0] a[1] a[2] a[3] a[4]
0 ? 1 ? ?
Вы начинаете писать после массива на итерации № 3:
*(a + index) accesses a[6]
a[0] a[1] a[2] a[3] a[4] | MEMORY NOT BELONGING TO a
0 ? 1 ? ? 3?
Кроме того, после начального цикла for
, в котором вы увеличивали указатель a
до конца выделенной суммы, вы пытаетесь получить к нему доступ снова, не сбрасывая его к первоначальному значению, поэтому значения, к которым вы обращаетесь, даже не равны. те, которые ты (думал, что ты) назначил.
Это особенно плохо для памяти, выделенной с помощью malloc
, поскольку вы обычно позже free
это делаете, но вы не можете сделать это без указателя на начало выделенного блока памяти.
Решение:
Не увеличивайте a
в вашем начальном цикле for
и используйте правильное условие истинности:
for(int index = 0; (a + index) < maxAddress; index++)
// Also valid: ...; index < MAX; ...
{
*(a + index) = index;
printf("Value: %d, Index: %d\n", *(a + index), index);
}