Неверный вывод после вызова функции

Я ожидаю, что результат не определен или что-то, но вывод «10», почему?

Я предполагаю, что память уничтожается после вызова функции.

#include <iostream>
void f(int *p)
{
int l = 20;
int *k = &l;
p = k;
}
int main()
{
int i = 10;
int *j = &i;
f(j);
std::cout << *j;
return 0;
}

0

Решение

Результат не определен. Вы передаете указатель j по значению, поэтому вы изменяете его копию внутри функции. Оригинал j остается без изменений, поэтому результат все еще 10,

5

Другие решения

Программа хорошо сформирована как локальная переменная l является не доступ за пределами f() как указатель j неизменен в main() (копия указателя j передается f()).

1

Разложим ваш код.

Вы сначала назначаете 10 для i, Тогда сделай j указать на адрес i,

В f вы устанавливаете значение p, а не значение, которое оно указывает на, в k, Как передано в качестве параметра f(), значение p копируется (адресное значение).

Следовательно, вы никогда не изменяете значение, указанное j, просто местное значение j в f()поэтому он остается равным 10,

1

В коде нет ничего плохого. Параметр f не передается по ссылке, поэтому f не имеет возможности изменить j, следовательно j еще указывает на i после f выходы.

1

Вы запутались в передаче по ссылке / передаче по значению. Когда вы передаете указатель, сам указатель — это число, которое вы передаете f() функция, указывающая на кусок памяти; изменение переменной * p в f() (а не кусок памяти, где *p указывает на) не будет иметь никакого эффекта в main() функция.

Указатель — это просто переменная, которая содержит адрес памяти. Само по себе оно передается по значению; только переменная на который указывает указатель передается по ссылке.

0
По вопросам рекламы [email protected]