

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ランキング
-
InvokeMemberメソッドとは何を...
-
isset — 変数が宣言されている...
-
「Aに対するBの割合」と「Aに対...
-
2÷3などの余りについて
-
20'(角度)の計算がわかりま...
-
プログラミング C言語 課題でプ...
-
#if 1 #elseの意味について
-
Enterキーを押されたら次の処理...
-
Aの値からBの値を除するとは??
-
信頼区間の1.96や1.65ってどこ...
-
C言語での引数の省略方法
-
O(n log n)について2
-
既定のコンストラクタがありま...
-
マイナスからプラスへ転じた時...
-
main.c:7:43: warning: implici...
-
任意の文字列のアルファベット...
-
10個出力で改行したいのですが...
-
fopenでファイル名に、変数を使...
-
#define _CRT_SECURE_NO_WARNIN...
-
既に定義されている関数のプロ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構造体のリスト削除
-
C# ref引数のnull判定
-
ばばぬきプログラムについて
-
双方向リストのバブルソートに...
-
C♯ 2段構造のcontextMenuStrip?
-
InvokeMemberメソッドとは何を...
-
isset — 変数が宣言されている...
-
別formの多重起動防止
-
バブルソートを使って文字列を...
-
今度はdoubly linked listの問...
-
空のカラムを挿入
-
コールバック関数はnullになら...
-
構造体について
-
「Aに対するBの割合」と「Aに対...
-
Aの値からBの値を除するとは??
-
Enterキーを押されたら次の処理...
-
複数桁10進数の*桁目だけを抽出...
-
main.c:7:43: warning: implici...
-
C言語での引数の省略方法
-
エクセルで可視セルにのみ値貼...
おすすめ情報