Я получаю проблему при копировании указателя на другой указатель в C ++ - PullRequest
0 голосов
/ 17 марта 2020

Я получаю ошибку сегментации в первом коде, но второй код работает нормально, не знаете как?

Как я могу скопировать указатель и сохранить его в другом указателе?

#include <iostream>

using namespace std;

int main() {
    int *p;
    int *p1;
    *p1=7;
    p=p1;
    cout<<*p<<" "<<p;
    return 0;
}
#include <iostream>

using namespace std;

int main() {
    int *p1;
    *p1=7;
    int *p=p1;
    cout<<*p<<" "<<p;
    return 0;
}    
//7 0x7ffeea73db70

Ответы [ 2 ]

4 голосов
/ 17 марта 2020

В обоих случаях вызывается неопределенное поведение, в обоих случаях вы используете неинициализированный указатель p1, тот факт, что второй случай "работает" для вас, является вопросом чистой удачи, как вы можете видеть здесь .

Для того, чтобы ваш код был действительным, вам нужно указать ему действительный адрес памяти, выделив память вручную:

int *p1 = new int; //raw pointer, (better to use smart pointers* but let's not get ahead of ourselves).

или присвоив ему адрес действительного int переменная:

int i = 5;
int *p1 = &i;

Как скопировать указатель и сохранить его в другом указателе?

Указатель по сути является переменной, как и любой другой, вы можете скопируйте его так, как будто вы делаете обычную примитивную переменную, фактически вы делаете именно это, когда вы делаете p = p1, это два разных указателя, которые теперь будут содержать одно и то же значение, адрес переменной, на которую они указывают.

Этот код иллюстрирует это

#include <iostream>

using std::cout;
using std::endl;

int main() {

    int *p1 = new int;
    *p1 = 7;
    int *p = p1;
    cout<< "Value stored in the address p points to: " << *p << endl  
        << "Value stored in the address p1 points to: " << *p1 << endl
        << "Address where p points to: " << p 
        << " " << endl <<  "Address where p1 points to: "<< p1 
        << endl << "Address of p: " << &p << endl << "Address of p1: "<< &p1;

    return 0;
} 

Вывод:

Value stored in the address p points to: 7
Value stored in the address p1 points to: 7
Address where p points to: 0x804150 
Address where p1 points to: 0x804150
Address of p: 0x7ffc9447e220
Address of p1: 0x7ffc9447e228

* Что такое умный указатель и когда его следует использовать?

2 голосов
/ 17 марта 2020

Когда вы разыменовываете указатель int*, вы обещаете, что по этому адресу есть объект int. С ++ верит вам, часто без вопросов. Но вы никогда не писали int a; p1=&a; или любой другой код, который бы гарантировал, что p1 указывает на фактический int.

На самом деле, p1 даже не является нулевым указателем. Единственное, что вы можете сделать с p1, это присвоить ему допустимое значение. То есть сначала он должен появиться в левой части задания. Его нельзя использовать с правой стороны в int* p = p1;

...