在C++中将一个指针复制到另一个指针

Ram*_*pta 6 c++ pointers

#include <iostream>

using namespace std;

int main(int argc, char **argv) {
    int a=5;
    int *p,*q;

    *p = a;
    *q = *p;  //line 6

    cout<<*p<<p<<*q<<q;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这个程序挂了.似乎问题出在第6行.为什么会这样?

Luc*_*ore 7

是的,那些是悬空指针,你正在遇到未定义的行为.

您不能取消引用指向您不拥有的内存的指针:

int* p;
*p; //illegal

int* x = NULL;
*x; //illegal

int* y = new int;
*y; //OK!
Run Code Online (Sandbox Code Playgroud)

正确的版本是:

int main(int argc, char **argv) {
    int a=5;
    int *p = new int; 
    int *q = new int;

    *p = a;
    *q = *p;  //line 6

    cout<<*p<<p<<*q<<q;

    delete p; 
    delete q;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

要么

int main(int argc, char **argv) {
    int a=5;
    int *p;
    int *q;

    p = &a;
    q = p;  //line 6

    cout<<*p<<p<<*q<<q;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

一个更正确的版本:

int main(int argc, char **argv) {
    int a=5;
    int p,q;

    p = a;
    q = p;  //line 6

    cout<<p<<p<<q<<q;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

没有指针:)


jah*_*haj 5

第5行也有问题。您已经声明了指针,但尚未使它们指向任何东西,这不会自动发生。像您那样取消引用未初始化的指针可能会导致程序崩溃。

这样的事情会更好。

int main(int argc, char **argv) {
    int a=5;
    int b, c;
    int *p,*q;

    p = &b; // make p point at b
    q = &c; // make q point at c
    *p = a;
    *q = *p;  //line 6

    cout<<*p<<p<<*q<<q;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)