Случайное поведение с разыменованием указателя в C ++

0

У меня есть следующий код:

#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.

  • 6
    Неопределенное поведение не определено.
  • 0
    Указатели работают только тогда, когда они указывают на что-то.
Показать ещё 1 комментарий
Теги:
pointers
dereference
segmentation-fault

3 ответа

0

Я не совсем уверен в цели вашего фрагмента, но следующий код будет работать, и, возможно, это поможет:

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 вернут одно и то же значение (расположение значения в памяти).

0
int* p;
*p = myvar;

Вы создаете неинициализированный указатель и затем переставляете этот указатель. Это имеет неопределенное поведение, потому что p должен указывать на что-то, чтобы оно было правильно перенесено. Поэтому поведение вашей программы не может быть обосновано.

  • 0
    Я понимаю, что не делаю правильную вещь, не инициализируя указатель. Дело в том, что я запускал это много раз, а g ++ выдает ошибку сегментации только тогда, когда я вставляю последнюю строку, а не когда я закомментирую ее. Я нахожу это удивительным, так как я не ожидал каких-либо изменений в переменной myvar. Я должен всегда печатать адрес myvar.
  • 0
    @YogeshRane, «Поэтому поведение вашей программы не может быть аргументировано». Это правда, неопределенное поведение может даже включать путешествие во времени .
Показать ещё 2 комментария
0

Сегментация Неисправность возникает при попытке доступа к адресу виртуальной памяти, у которого нет разрешений на чтение.

В вашем случае локальная переменная p содержит неинициализированный мусор из стека. вы разыскиваете адрес памяти, который может быть недоступен для чтения (например, нет разрешений на чтение, следовательно, ошибка сегментации при попытке получить к нему доступ).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню