У меня есть следующий код:
#include <iostream>
using namespace std;
int main ()
{
int myvar = 5;
int * p;
cout << "Hello2" << endl;
*p = myvar;
cout << "Hello" << endl;
cout << p << endl;
//cout << &myvar << endl;
}
Я знаю, что я не делаю правильно, не инициализируя указатель. Я просто играл с указателями и замечал это. Проблема в том, когда я прокомментирую последнюю строку, программа выполняется нормально. Но как только я раскомментирую строку, я получаю ошибку сегментации. Я не знаю, почему это печатает адрес myvar? Изменен ли myvar каким-либо образом из-за разыменования указателя? Я использую С++ 11.
Я не совсем уверен в цели вашего фрагмента, но следующий код будет работать, и, возможно, это поможет:
int myvar = 5;
int *p = nullptr;
p = &myvar;
cout << myvar << endl;
cout << &myvar << endl;
cout << p << endl;
cout << *p << endl;
(Примечание: я использовал две строки для установки "p", потому что так вы сделали это в своем фрагменте. Вы можете просто использовать: int * p = & myvar;)
Во всяком случае, здесь есть проблемы с областью, так как p будет действителен только до тех пор, пока myvar находится в сфере охвата; однако это иллюстрирует основы указателей. myvar и * p вернут одно и то же значение (указываемое значение), а & myvar и p вернут одно и то же значение (расположение значения в памяти).
int* p;
*p = myvar;
Вы создаете неинициализированный указатель и затем переставляете этот указатель. Это имеет неопределенное поведение, потому что p
должен указывать на что-то, чтобы оно было правильно перенесено. Поэтому поведение вашей программы не может быть обосновано.
Сегментация Неисправность возникает при попытке доступа к адресу виртуальной памяти, у которого нет разрешений на чтение.
В вашем случае локальная переменная p
содержит неинициализированный мусор из стека. вы разыскиваете адрес памяти, который может быть недоступен для чтения (например, нет разрешений на чтение, следовательно, ошибка сегментации при попытке получить к нему доступ).