

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:39
No.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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【C++】ストリームオブジェクト...
-
C# ref引数のnull判定
-
ある商品のロス率を5%見込み、...
-
「Aに対するBの割合」と「Aに対...
-
信頼区間の1.96や1.65ってどこ...
-
えきねっとのトクだ値とトク割...
-
マイナスからプラスへ転じた時...
-
有効数字について 以前質問をし...
-
Enterキーを押されたら次の処理...
-
O(n log n)について2
-
C言語 エラーの原因がわからな...
-
プログラミング C言語のエラー...
-
str系関数を使わずに二つの文字...
-
std::set<int> で、ある値が何...
-
#define _CRT_SECURE_NO_WARNIN...
-
EXCELの分散分析表のP-値が....
-
至急お願いします。プログラミ...
-
大きな負の値?負の大きな値???
-
C++にてtemplateで受け取った任...
-
char型配列について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
InvokeMemberメソッドとは何を...
-
C# ref引数のnull判定
-
ばばぬきプログラムについて
-
API 録音 MCI
-
C#でのEXCEL出力に関して
-
構造体のリスト削除
-
コールバック関数はnullになら...
-
バブルソートを使って文字列を...
-
空のカラムを挿入
-
別formの多重起動防止
-
C言語 dequeue
-
大学で出されたc言語の課題に...
-
双方向リストのバブルソートに...
-
「Aに対するBの割合」と「Aに対...
-
Aの値からBの値を除するとは??
-
信頼区間の1.96や1.65ってどこ...
-
「指定されたキャストは有効で...
-
エクセルで可視セルにのみ値貼...
-
DWORDの実際の型は何でしょうか
-
C言語での引数の省略方法
おすすめ情報