0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

C++ 変数宣言時にアドレスが渡される?渡されない?(クラス変数とポインタ変数)

Last updated at Posted at 2020-04-22

##はじめに

C++を1年前くらいから扱うようになりましたが、いまだにポインタとかメモリとかあやふやです。。。

初めてqiitaに書き込みます。
なので、書き方や言い回しなどもしかしたら酷いものかもしれません・・・
しかし同じような悩みを抱えている人がいれば!!

##本題
今日も仕事で遭遇したメモリ関連に関して記事にします。

どうやら、クラス変数を普通に宣言する場合と、ポインタとして宣言する場合でメモリが割り当てられたり割り当てられなかったりするみたいです。

下記がソースです。

class CTest
{
public:
	CTest() { m_no = 0; };
	~CTest() {};

public:
	int m_no;
};

int main()
{
	//クラスを変数で宣言
	CTest test;
	printf("testに割り振られたアドレス:%p\n", &test);
	test.m_no = 0; //【死なない!!】 アドレスあるからか!?

	//クラスをポインタ変数として宣言
	CTest* pTest = NULL;
	printf("pTestに割り振られたアドレス:%p\n", pTest);
	pTest->m_no = 0; //【死ぬ!!】 アドレスないものに突っ込もうとするからか!?

	return 0;
}

ソースの中の【死ぬ!!】のところで落ちましたよね。。。
ここらへんが自分でも最初は理解できず。。。

コンソールには、下記のような結果が表示されていると思います。
 testに割り振られたアドレス:00BAFA0C
 pTestに割り振られたアドレス:00000000

要するに、pTestにはアドレスが割り振られているようで振られていません!
アドレスの存在しないpTestに、pTest->m_noでアクセスしようとしたせいで死んだようです。

なのでポインタに、インスタンス化された変数をあげればうまくいきます。
下記参照

class CTest
{
public:
	CTest() { m_no = 0; };
	~CTest() {};

public:
	int m_no;
};

int main()
{
	//クラスを変数で宣言
	CTest test;
	printf("testに割り振られたアドレス:%p\n", &test);
	test.m_no = 0; //【死なない!!】 アドレスあるからか!?

	//クラスをポインタ変数として宣言
	CTest* pTest = NULL;
//↓↓↓↓↓↓ここが追加した部分↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
	pTest = &test;
//↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
	printf("pTestに割り振られたアドレス:%p\n", pTest);
	pTest->m_no = 0; //【死なない!!】 アドレスが割り振られたから!!

	return 0;
}

文章すごくわかりにくいかもしれません。

ポインタ・メモリに1年振れて思うのは、難しいけど面白い!!です。

それではまた記事書きたいと思います。

0
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?