Нужна помощь для понимания семантики указателя - PullRequest
2 голосов
/ 22 декабря 2011

См. Следующий фрагмент кода и мое объяснение результата.

void f (int * p, int * q)
{
    p = q;
    *p = 2;
}

int i = 0;
int j = 1;

int main ()
{
    f(&i, & j);

    printf("%d %d\n", i, j);

    return 0; 
}

У нас есть две глобальные переменные i и j, и мы передаем указатель этих двух переменных в функцию f.Когда мы делаем p = q, мы фактически теряем ссылку на i, и мы получаем два указателя, а именно p и q, оба указывая на j.затем, когда мы делаем *p = 2, мы фактически меняем значение j на 2.

Однако, поскольку мы потеряли ссылку на i на шаге p = q в основной программе, значение i, которое будет напечатано, является глобальной переменной 0.Следовательно, мы получаем результат как i = 0 и j = 2.

, пожалуйста, скажите мне, если это правильное объяснение ...

Теперь другой вопрос, когда мы делаем p = q вфункция f, создаст ли утечку памяти, потому что значение, ранее указанное p, будет недоступно.

1 Ответ

0 голосов
/ 22 декабря 2011

Выполнение p = q в функции изменяет только локальную переменную p, поэтому i остается неизменным, а &i в main остается таким же, как и до вызова функции.Кроме того, утечки памяти возможны только при использовании malloc() или calloc() без соответствующего free() (включая эквивалентное использование realloc()).

В противном случае ваше объяснение верное.

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