

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で質問しましょう!
似たような質問が見つかりました
- 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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
構造体のリスト削除
-
Enterキーを押されたら次の処理...
-
「指定されたキャストは有効で...
-
「Aに対するBの割合」と「Aに対...
-
複数桁10進数の*桁目だけを抽出...
-
2÷3などの余りについて
-
エクセルで可視セルにのみ値貼...
-
数字以外が入力されたらエラー...
-
Aの値からBの値を除するとは??
-
#if 1 #elseの意味について
-
C言語での引数の省略方法
-
間接参照のレベルが異なっています
-
fgetsなどのときのstdinのバッ...
-
DWORDの実際の型は何でしょうか
-
構文エラー";"が型の前にあり...
-
10個出力で改行したいのですが...
-
エクセルの問題です。絶対値の...
-
java初心者です。入力されたの...
-
*をユーザーが入力した数字の数...
-
for文の中にswitch文はいれられ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構造体のリスト削除
-
コールバック関数はnullになら...
-
InvokeMemberメソッドとは何を...
-
C# ref引数のnull判定
-
双方向リストのバブルソートに...
-
C#でのEXCEL出力に関して
-
プログラミング(C#)のエラーに...
-
if文でゼロとNULLを除外するた...
-
PLSQLについて
-
バブルソートを使って文字列を...
-
【C++】ストリームオブジェクト...
-
SQLのIN関数に関して
-
文字列の結合方法(SQL)
-
ばばぬきプログラムについて
-
今度はdoubly linked listの問...
-
API 録音 MCI
-
大学で出されたc言語の課題に...
-
C言語
-
isset — 変数が宣言されている...
-
Aの値からBの値を除するとは??
おすすめ情報