🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

1885閲覧

呼び出し先関数で引数ポインタ変数にnullptr代入

JanTh1989

総合スコア87

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/09/18 03:06

質問

呼び出し先関数で引数のポインタ変数にnullptrを代入しているのですが、関数から戻ってきてからの引数に使った変数が、nullptrと一致してくれません。
処理に誤りがあるのか、そもそも出来ないのかが判断できておりません。
対処方がございましたら、ご教授願います。

サンプルコード

目指しているところとしましては、TestStart関数からS_FALSEが返ってきて欲しいです。

C++

1static const bool b = true; 2 3class sample 4{ 5 int a; 6}; 7 8HRESULT TestStart() 9{ 10 sample* s = nullptr; 11 NullTest(s); 12 13 if (nullptr == s) return S_FALSE; 14 return S_OK; 15} 16void NullTest(sample* s) 17{ 18 if (b) 19 s = nullptr; 20} 21int _tmain(int argc, _TCHAR* argv[]) 22{ 23 TestStart(); 24 return 0; 25}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

NullTest()の内容の無意味さと改善方法は既に回答されていますが……
とりあえず示されたコードでは

関数から戻ってきてからの引数に使った変数が、nullptrと一致してくれません。

ということにはならないでしょうし,

TestStart関数からS_FALSEが返ってきて欲しいです。

に関してもS_FALSEが返ってきていると思うのですが.

投稿2019/09/18 03:37

fana

総合スコア11985

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JanTh1989

2019/09/28 04:57

NullTest関数の中身はあくまでsがnullptrになってくれない、のサンプルでした。 サンプルとして出すだけなら、ただnullptrを入れるだけでも良かったですね。 すみません。
guest

0

こんにちは。

ポインタを関数の引数に指定する機能はC言語にもありますね。
そして、C言語の関数の引数は全て「値」渡しです。つまり、ポインタ変数に入っているアドレスが コピー されてポインタ型仮引数に設定されます。

この振る舞いはC++でも同じですので、仮引数sには実引数sに入っている「アドレス」がコピーされて渡されます。つまり、NullTest()関数内で仮引数sにnullptrを設定していますが、これは呼び出し元の実引数sの値(アドレス)には反映されません。

投稿2019/09/18 03:23

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JanTh1989

2019/09/28 04:52

ご回答ありがとうございます。 詳しい情報ありがとうございました。 izmktr様から提示頂いたコードにも繋がる情報をありがとうございます。
guest

0

ベストアンサー

s = nullptr;
これでは、ローカル変数のsを書き換えているだけで、関数上位に伝えることは出来ません

void NullTest(sample** s){ *s = nullptr; } //または void NullTest(sample*& s){...}

とする必要があります

投稿2019/09/18 03:20

izmktr

総合スコア2856

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JanTh1989

2019/09/28 04:48

ご回答ありがとうございます。 ダブルポインタである必要があったのですね。 知識不足でした。 これで対応を行っていくようにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問