C ++ - указатель на локальную переменную в коде упражнения Google - PullRequest
0 голосов
/ 22 апреля 2020

Здесь , в Упражнении № 1 есть функция HardToFollow:

void HardToFollow(int *p, int q, int *num) {
    *p = q + *num;
    *num = q;
    num = p;
    p = &q;
    Unknown(num, *p);
}

Вторая последняя строка указывает p на q, который является локальным переменная (копия аргумента). Указатель на локальную переменную.

Позже в основной функции указатель передается, поскольку этот первый аргумент используется после вызова. Разве это не должно быть неопределенным поведением? Не должен ли указатель, переданный в качестве первого аргумента, быть неопределенным после вызова HardToFollow()?

Редактировать: Я понял, что это не неопределенное поведение, сам указатель можно изменить, не отражая поведение переданного аргумента, только изменения указанного значения будут постоянными.

1 Ответ

2 голосов
/ 22 апреля 2020

Помните, что все аргументы по умолчанию передаются по значению . Это означает, что значение переданного выражения копируется в локальную переменную аргумента функции. Это также означает, что изменение переменной аргумента (например, присвоение ей) будет изменять только локальную переменную аргумента, а не исходное значение, используемое при вызове функции.

Вот что происходит здесь: кто-то вызывает HardToFollow функция передачи указателя. Значение этого указателя копируется в локальную переменную аргумента p. И любое присвоение p само по себе только изменяет локальную переменную p.

Так что нет, это не приведет к UB, это совершенно верно.

...