No.6ベストアンサー
- 回答日時:
>callBackAddress = null;だけチェックすれば*callBackAddress = null;(又は0x00)はチェックしなくてよいのでしょうか?関数のアドレスだからチェックしなくとも大丈夫なのでしょうか?
結論からいうとチェックしなくてかまいません。
関数へのポインターである場合に限り、
callBackAddressと*callBackAddressはおなじ値になります。
これは、通常のポインター(例えば int *a)の場合、以下の意味になります。
int *a ;
int x;
a = null;
a = &x;
if (a==null)はポインターがnullかを問うものであり
if (*a == null)(又は0x00)は、変数xの内容が0x00かを
問うものです。従って、全く違ういみのものです。
一方、関数へのポインターcallBackAddressの場合は
callBackAddressと*callBackAddressは同じ値となります。(Funcのアドレスを示します)
これは、不思議な感じがしますが、そのように定義されているようです。
callBackAddress = Func;
のあとで
printf ("%p\n",callBackAddress);
printf ("%p\n",*callBackAddress);
printf ("%p\n",**callBackAddress);
printf ("%p\n",Func);
としてください。
結果はすべて同じ値となります。
No.5
- 回答日時:
>実は、単体テストをしていて、callbackAddressがnullのときにセグメントエラーが発生してしまったので、callbackAddressがnullのときの考慮が必要だなあと思ったのですが,ついでに*callbackAddressがnullの場合も考慮すべきかどうかというので悩んでおりました。
NO.2の方の解答には納得です。質問の主旨が判りました。
やりたいことは、関数へのポインターが未設定(=null)のときに、異常終了しないような仕組みをつくりたいということですね。以下のようにしてください。
------------------------------------
int (*callbackAddress)(); //関数へのポインタ宣言
callbackAddress = null; //まず、nullを設定しておく
・・・
・・・
callbackAddress = Func;//ある条件のときにFuncへのポインターが設定される。(しかし、必ずこのステップが実行されるとは限らない)
・・・・
if (callbackAddress == null){
//このケースは、未設定のケースだ。実際に呼び出してはいけない。エラーメッセージをだして、処理をうち切るのが普通のやりかた。
}else{
//OK、設定されている
stat =(*callBackAddress)(num);//実際に呼び出す。
}
---------------------------------
ちなみに
*callBackAddress = null;(又は0x00)
はやってはいけません。
callBackAddress = null;として下さい。
この回答への補足
詳細にありがとうございます。callBackAddress = null;だけチェックすれば*callBackAddress = null;(又は0x00)はチェックしなくてよいのでしょうか?関数のアドレスだからチェックしなくとも大丈夫なのでしょうか?どうもすっきりしないのですが。。。
補足日時:2005/04/07 20:39No.4
- 回答日時:
なさりたいのは、
callbackAddress = Func;
*callbackAddress = 0x00;
stat =(*callBackAddress)(num);
のようにしたいと言うことでしょうか。
もし、そうであれば、No2の方が言及しているとおりです。
そのことにより、プログラムが異常終了しますが
あなたが、そのことを望んでいるとは、思えません。
本当になさりたいことは、何なのでしょうか。もしくは、どうして、このような質問をされたのでしょうか。その辺の状況を説明していただければ、もっと適切な回答ができるかと思います。
この回答への補足
返信が遅れ,もうしわけありません。実は、単体テストをしていて、callbackAddressがnullのときにセグメントエラーが発生してしまったので、callbackAddressがnullのときの考慮が必要だなあと思ったのですが,ついでに*callbackAddressがnullの場合も考慮すべきかどうかというので悩んでおりました。NO.2の方の解答には納得です。
補足日時:2005/04/07 19:21No.3
- 回答日時:
突っ込みどころ満載ですが、それはさておき...
callbackAddressはvoid型へのポインタですので、このポインタを用いて間接参照することも関数を呼び出すこともできません。
関数が格納されているエリアを書き換えたいということであれば、(適切な文法に修正することで)可能ですが、何らかの事情(ROMであったり、MMUによるメモリ保護がかかっていたり)で書き換えが禁止されていたり、場合によっては同じアドレスに書き込みレジスタが配置されていたりすることもあり得ますので、何が起こるかはターゲットに依存します。言語仕様上はもちろん未定義です。
No.2
- 回答日時:
言語上はできます。
そうすることに意味はありませんが。
callbackAddress には Func 関数が存在する物理アドレスが入っているので、NULL(0x00) を挿入した状態で実行するとプログラムが停止します。(厳密には例外が発生します)
OS上の制限により、アドレスゼロの領域を実行することはできないのです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# Cのオブジェクトファイルの逆アセンブル 5 2023/05/13 01:51
- C言語・C++・C# C pointer? or... 2 2022/03/29 00:47
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「黒歴史」教えて下さい
- ・2024年においていきたいもの
- ・我が家のお雑煮スタイル、教えて下さい
- ・店員も客も斜め上を行くデパートの福袋
- ・食べられるかと思ったけど…ダメでした
- ・【大喜利】【投稿~12/28】こんなおせち料理は嫌だ
- ・前回の年越しの瞬間、何してた?
- ・【お題】マッチョ習字
- ・モテ期を経験した方いらっしゃいますか?
- ・一番最初にネットにつないだのはいつ?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コールバック関数はnullになら...
-
InvokeMemberメソッドとは何を...
-
構造体のリスト削除
-
ある商品のロス率を5%見込み、...
-
最早開始時間と最遅完了時刻を...
-
信頼区間の1.96や1.65ってどこ...
-
「指定されたキャストは有効で...
-
エクセルで可視セルにのみ値貼...
-
「Aに対するBの割合」と「Aに対...
-
ExcelでPC(パソコン)によって...
-
Enterキーを押されたら次の処理...
-
2÷3などの余りについて
-
エクセルのオートフィル?ドラ...
-
複数桁10進数の*桁目だけを抽出...
-
Aの値からBの値を除するとは??
-
long型の定数の末尾にLを付ける...
-
C言語での引数の省略方法
-
マイナスからプラスへ転じた時...
-
値差の%計算方法について
-
数学のデータの相関の散布図で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構造体のリスト削除
-
InvokeMemberメソッドとは何を...
-
C# ref引数のnull判定
-
C言語 リスト
-
コールバック関数はnullになら...
-
C#でのEXCEL出力に関して
-
空のカラムを挿入
-
if文でゼロとNULLを除外するた...
-
ばばぬきプログラムについて
-
リスト構造
-
C言語 リスト
-
信頼区間の1.96や1.65ってどこ...
-
「Aに対するBの割合」と「Aに対...
-
エクセルで可視セルにのみ値貼...
-
Enterキーを押されたら次の処理...
-
「指定されたキャストは有効で...
-
2÷3などの余りについて
-
C言語での引数の省略方法
-
Aの値からBの値を除するとは??
-
DWORDの実際の型は何でしょうか
おすすめ情報