#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;
}
このプログラムはハングします。問題は 6 行目にあるようです。なぜですか?
はい、それらはぶら下がっているポインターであり、未定義の動作に遭遇しています。
所有していないメモリを指すポインターを逆参照することはできません。
int* p;
*p; //illegal
int* x = NULL;
*x; //illegal
int* y = new int;
*y; //OK!
正しいバージョンは次のとおりです。
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;
}
また
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;
}
さらに正しいバージョン:
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;
}
ポインターはありません:)
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;
}
あなたが持っているコードは、pに何かが保存されていないときに何かが保存されていると想定しています。
これはあなたがやろうとしていたことですか?
int a=5;
int *p,*q;
p = &a;
q = p; //line 6
cout<<(*p)<<p<<(*q)<<q;
上記のコードでは、プログラムの最後で、p と q が同じアドレス (整数 a が格納されているアドレス) を指しています。
次のように、別の変数を使用して 2 つのポインターをコピーできます。
#include<iostream>
using namespace std;
int main()
{
int *p,*q;
int a = 5;
p = &a;
q = &(*p);
a = 10;
std::cout<<*p<<std::endl;
std::cout<<*q<<std::endl;
}
ただし、上記の例では、両方のポインターが指すアドレスは同じではありません。これにより、両方のポインターが変数 a によって決定されます。C++ では、これを行う別の良い方法は、参照を使用することです。
int a = 5;
int& p = a;
int& q = p;
std::cout<<p<<std::endl;
std::cout<<q<<std::endl;
std::cout<<&p<<std::endl;
std::cout<<&q<<std::endl;
結果:
5
5
0xbf9e7498
0xbf9e7498