Арифметика указателя с указателем на указатель на удвоение - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь понять, что происходит, когда я выполняю этот

#include <stdio.h>

const int MAX = 3;

int main () {

   //double  var[] = {10.0, 100.1, 200.2};
   double  var[3];
   int  i;
   double *ptr;
   double **ptr2;


   for(i=0;i<MAX;i++)var[i] = 10.0*(double)(i+1);
   /* let us have array address in pointer */
   ptr = var;
   ptr2 = &ptr;

   for ( i = 0; i < MAX; i++) {

      printf("Address of var[%d] = %x\n", i, *ptr2 );
      printf("Value of var[%d] = %f\n", i, **ptr2 );

      /* move to the next location */
      ptr2++;
   }

   return 0;
}

Этот фрагмент кода выдает ошибку сегмента на второй итерации

Address of var[0] = b0e04370                                                                                                                                                                 
Value of var[0] = 10.000000                                                                                                                                                                  
Address of var[1] = 0  

Однако это работает, если вместо вызоваptr2 мы звоним ptr

for ( i = 0; i < MAX; i++) {

 printf("Address of var[%d] = %x\n", i, ptr );
 printf("Value of var[%d] = %f\n", i, *ptr );

  /* move to the next location */
  ptr++;
}

давая

Address of var[0] = 3e9e89a0                                                                                                                                                                 
Value of var[0] = 10.000000                                                                                                                                                                  
Address of var[1] = 3e9e89a8                                                                                                                                                                 
Value of var[1] = 20.000000                                                                                                                                                                  
Address of var[2] = 3e9e89b0                                                                                                                                                                 
Value of var[2] = 30.000000 

1 Ответ

0 голосов
/ 10 мая 2018

Это 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].
Я думаю, это объясняет. Может быть, вы могли бы попробовать третью итерацию самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...