Это segfaults, потому что следующий адрес на самом деле ничего не содержит.
Я изменил цикл на этот, и теперь он работает так, как вы ожидаете:
/* let us have array address in pointer */
ptr = var;
ptr2 = &ptr;
for (i = 0; i < MAX; i++)
{
printf("Address of var[%d] = 0x%x\n", i, (void*)*ptr2 );
printf("Value of var[%d] = %f -- using ptr\n", i, *ptr);
printf("Value of var[%d] = %f -- using ptr2\n", i, **ptr2);
ptr++;
// This updates ptr2, which was missed out
ptr2 = &ptr;
}
С этим он печатает следующее:
Address of var[0] = a313c9b0
Value of var[0] = 10.000000 -- using ptr
Value of var[0] = 10.000000 -- using ptr2
Address of var[1] = a313c9b8
Value of var[1] = 20.000000 -- using ptr
Value of var[1] = 20.000000 -- using ptr2
Address of var[2] = a313c9c0
Value of var[2] = 30.000000 -- using ptr
Value of var[2] = 30.000000 -- using ptr2
Причина, по которой ваш код вызывает ошибки на секунде итерации (а не на первом) -
ptr = var;
ptr2 = &ptr;
С этими двумя строками ptr2
не содержит адрес ptr
, в то время как ptr
указывает на var[0]
Посмотрим теперь вторую итерацию с обновленным кодом:
ptr++;
, что делает ptr
указанием на var[1]
ptr2 = &ptr;
, что заставляет ptr2
содержать адрес ptr
, который теперь указывает на var[1]
.
Я думаю, это объясняет. Может быть, вы могли бы попробовать третью итерацию самостоятельно.