У меня есть следующий код, и я задаюсь вопросом, почему это работает, как это делает:Что произойдет, если указатель исчерпывает сферу
void addFive(int* a) {
int* b;
b = a;
*b = *b + 5;
}
int main(int argc, char** argv) {
int* nbr;
*nbr = 3;
addFive(nbr);
std::cout << *nbr << std::endl;
return 0;
}
Это дает выход 8.
Я интересно Зачем? Указатель int* b
заканчивается в конце функции addFive. Кроме того, int* b
не знает о существовании int* nbr
(одно преимущество интеллектуальных указателей). Я ожидал, что код создаст ошибку сегментации в строке std::cout << *nbr << std::endl;
Почему этот код не дает ошибки сегментации?
'int * nbr; * nbr = 3; 'вы получаете доступ к случайной памяти, которой у вас нет. Пример имеет UB. – Angew
Неинициализированные указатели = Неопределенное поведение. Вы никогда не делаете «nbr» точку ни на что. – Roddy
умные указатели? – Janosimas