2016-01-29 2 views
0

У меня есть следующий код, и я задаюсь вопросом, почему это работает, как это делает:Что произойдет, если указатель исчерпывает сферу

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;

Почему этот код не дает ошибки сегментации?

+0

'int * nbr; * nbr = 3; 'вы получаете доступ к случайной памяти, которой у вас нет. Пример имеет UB. – Angew

+0

Неинициализированные указатели = Неопределенное поведение. Вы никогда не делаете «nbr» точку ни на что. – Roddy

+0

умные указатели? – Janosimas

ответ

1

Функция addFive не является нормальным сам по себе, но оно должно быть написано так:

void addFive(int* a) 
{ 
    *a += 5; 
} 

И нет никаких проблем с b рамки указателя, потому что сам указатель только локальная переменная.

Настоящая проблема в вашем коде заключается в том, что вы не выделяли память для своего целого и пытались получить доступ к неинициализированной памяти с помощью указателя nbr, который приведет вас к неопределенному поведению. На моей машине ошибку сегментации на этой линии:

*nbr = 3; 

Ваш главный должен быть переписано так:

int* nbr = new int(3); 
addFive(nbr); 
std::cout << *nbr << std::endl; 
return 0; 

Тогда вы можете надежно ожидать «8» в вашем выводе.

1

Почему этот код не дает ошибки сегментации?

Ваше мнение по поводу Ошибка сегментации. Но все случайные обращения к памяти не будут создавать дефект сегментации. Если случайно доступная память имеет protection rights, то только она создает ошибка сегментации. Если у него нет защиты, вы можете без проблем получить доступ к памяти, но с undefined behavior, потому что вы не могли принять содержимое в случайной памяти. Хорошее иллюстрированное объяснение - here.

Смежные вопросы