обновление указателя в массиве не обновляет исходный указатель - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть шар, у которого есть 1 смежный шар, как показано в коде ниже. Проблема, с которой я сталкиваюсь, заключается в обновлении значения шара 2, которое хранится в смежном шаре ball1, не обновляет фактический шар 2.

    struct ball {
      struct ball * adjacent;
      size_t n_adjacent;
    };


    // Setting ball 2
    struct ball ball2 = { .n_adjacent= 0, .adjacent = NULL } ;


    // setting ball 1
    struct ball ball1 =  { .n_adjacent= 1, .adjacent = NULL } ;

    // setting ball 1's adjacent 
    struct ball * ball1_adj = (struct ball*) calloc(1, sizeof(struct ball));
    ball1_adj[0] = ball2;

    ball1.adjacent = ball1_adj;

    printf("Address of original ball 2 is: %p\n", &ball2);
    printf("Address of ball 2 in the array is: %p\n", &(ball1.adjacent[0]));

    // different but Ok as malloc has returned a pointer

    ball1.adjacent[0].n_adjacent = 10;   // Updating ball 2 's adjacents

    printf("Adjacent of original ball 2 is: %d\n", ball2.n_adjacent); // prints 0
    printf("Adjacent of ball 2 in the array is: %d\n", (ball1.adjacent[0]).n_adjacent); // prints 10
    • Arent ball2 и ball1.adjacent [0] тот же шар (ball2)?
    • Почему значение ball2 не обновлялось?

Спасибо

1 Ответ

1 голос
/ 06 апреля 2020

Arent ball2 и ball1.adjacent [0] один и тот же шар (ball2)?

Нет. Вы делаете копию ball2 и сохраняете ее в ball1_adj[0] Затем вы присваиваете адрес этой копии ball1.adjacent

Почему значение ball2 не обновлялось?

Поскольку изменение копии не влияет на источник этой копии. Так же, как запись фотографии вашего автомобиля не повредит вашему автомобилю.

Если вы хотите изменить другие структуры с помощью указателя adjacent, вам нужно назначить адрес другой структуры вместо копии:

ball1.adjacent = ball1_adj;
=>  ball1.adjacent = &ball2;
...