• ベストアンサー

不適切なポインタ

あるポインタがあって、そのポインタが「不適切かどうか」で条件分岐させたいのですが、そんなことってできるでしょうか?? ポインタの指す値で評価しようとすると、不適切なポインタの場合はエラーになってしまいますので、もちろんできません。

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

例外ハンドラを記述して、例外エラーを検出して下さい。 例外ハンドラの記述方法は処理系により異なるので、残念ながら具体例は示せません。

ooss
質問者

お礼

例外処理ですね。 使ったことがなかったのでちょっと調べてみましたが、これでいけそうです。ありがとうございます。 ただ、上の方のご指摘にあるようにそもそも良くないことが明らかなので、全体を1から再考してみます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.2

# 本来的には不適切にならないようにNULL初期化などを正しく行うべきであり、 # NULLでないポインタが不適切かどうかを正しく判断することは通常できません。 # 不定なポインタの内部を参照した時点で不定動作。 # よって、それに基づいての分岐処理は不適切といえます。 なお、環境依存(Windows用)ですが、デバッグ機能として例えば以下のような"不完全な"チェック関数は存在することがあります。 IsBadCodePtr, IsBadReadPtr, IsBadStringPtr, IsBadWritePtr ※このAPIは、条件に適合する場合にデバッガを起動しようとします。

ooss
質問者

お礼

ありがとうございます。 確かにご指摘のとおりそもそも不適切な処理かもしれません。 全体を再考してみます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ポインタのポインタの必要性

    書物によるとポインタのポインタの使用例として「ポインタの配列」はポインタを使ってアクセスすることができます。」[*]とありますが、どうしてポインタのポインタが必要なのかがいまいちピンと来ません。 どういう場合なのかを知りたく思っています。 [*]サンプルスクリプト ===================================================== char *mnthp[3] = {/* ポインタの配列の宣言 */ "January", "February", "March" }; char **p1;/* 「ポインタのポインタ」の宣言 */ int i, j; p1=mnthp;/* 「ポインタのポインタ」にポインタの配列 */ /* の先頭番地を設定 */ /***** 例1 *****/ for (i = 0; i < 3; i++) {/* 「ポインタのポインタ」の値を変えずに */ printf("%s\n", *(p1 + i));/* 相対的に文字列を出力 */ } ==> このようなことをしなくとも printf("%s", mnthp[i]); で値を参照出来ると思われる。 ===================================================== [*] http://www9.plala.or.jp/sgwr-t/c/sec10-4.html 宜しくお願い致します。

  • フレームポインタについて

    こんにちは x86の場合、フレームポインタは関数呼び出し直後のスタックポインタの値を保持してると書いてありました スタックは引数、リターンアドレス、ebp保存値、ローカル変数の順番で格納されると認識しています 関数呼び出し直後のスタックポインタの値とは、正確にはどこを指してるのでしょうか よろしくお願いします

  • ポインタのポインタ

    こんにちは。 C言語の「ポインタのポインタ」の学習中なのですが、以下のプラグラムがエラーが出てしまします。 if文が間違っていると思うのですが、具体的に何がどう間違っているのがわかりません。 ご教示お願いいたします! #include<stdio.h> int main(void) { int date = 300; int *pdate = NULL; int **ppdate = NULL; printf("dateの値は%d<\n", date); pdate = &date; printf("*pdateの値は%d<\n", *pdate); if(**ppdate = NULL){ printf("**ppdateには何も与えられていません。\n"); } else{ return 0; } ppdate = &pdate; if(**ppdate == 300){ printf("**ppdateの値は%dになりました。正常です。\n", **ppdate); } /*強制終了を避けるためのプログラム*/ int i; scanf("%d", &i); return 0; }

  • ポインタについて

    配列のポインタについて教えてください。 int array[2][2]={1,2,3,4}; int *p; のような場合、 p=array;  にするとエラーがでますが、なぜですか? (p=(int *)array;のようにキャストすれば平気) _1_2_3_4_という風にメモリー上に並んでいますよね? 配列の場合array(&array[0][0])はこのメモリーの1が格納されているアドレスを指すわけですが、これをポインタpに入れるとなにか問題でも起こるんですか?

  • ポインタのポインタについて

     Cの初心者です、宜しくお願いします。  **(ポインタのポインタ)って言うのがあるみたいですが、どのような場合に使うのでしょうか。

  • VB6でポインタ?

    VB6でポインタを扱う関数 VarPtrがあるのですが、使えるデータ型は何があるのでしょうか? 仕様なのか、動的配列のポインタが取得できません。 dim kosuu() as integer redim kosuu(50) dim pointer as long pointer = VarPtr( kosuu() ) 'エラー VB6でポインタを扱う場面は例えばどんな場合があるか知りたいです。 ポインタは使わない(使ってはいけない)のが基本でしょうか。

  • ポインタについての良いテキストを探しています。

    ポインタ完全制覇、秘伝問答ポインタ編は読了しました。 しかし、ダブルポインタ(便宜上こう書きますが、ポインタのポインタのことです)や トリプルポインタが出てくると、いきなり分からなくなってしまいます。 アドレスと値の関係を図解してみても、なぜこんな風にする必要があるのだろう?その必然性は? となってしまい、本質的な理解ができていないと感じています。 関数に渡すときの値渡しと参照渡しについては理解できているつもりです。 ですが、それに、構造体や、構造体のメンバーに文字列がある場合、mallocなどが関わってくると ゴチャゴチャになっていきなり分からなくなってしまいます。 上記の本は、文字列と配列とポインタあたりは解説してあり、そのあたりは理解しているつもりなのですが、ダブルポインタやトリプルポインタについては明確な記載がありません。 以前の質問で、 http://okwave.jp/qa/q6478987.html >3次元の構造を持つなら 3次元配列が必要であり, それを動的に確保しようとしたら「ポインタのポインタのポインタ」は自然な発想だと思う. とご回答を頂いたことがあるのですが、"自然に"だけでなくじっくり考えても理解できていません。 その他のご回答もなぜそのような状況でそのようなポインタの使い方が必要になるのかなど理解出来ないところが多いです。 基礎が大事だというのは十分理解しているつもりですが、 基礎だけでなく、その上のレベルでのポインタの解説や勉強に役立つテキストを教えてください。 なにとぞよろしくお願いいたします。 また、所要のため土日はネットに繋ぐことができませんのでお返事が遅れることをご了承ください。

  • ポインタいついて教えてください

    ポインタがわかりません。 教えてください。 下の二つは、共に「100」を表記すると思いますが、 どこがどのように違うのですか。 また、f1()という関数をつくって、ここで scanfを使って、5つぐらい値を代入させて、 他の関数でこの値を使おうと思っています。 この場合下のどちらを使うのが、よろしいのでしょうか。 よろしくお願いします #include <stdio.h> int main(void) { int *p, q; q = 100; /* q に100を代入 */ p = &q; /* p にq のアドレスを割り当てる */ printf("%d", *p); return 0; } #include <stdio.h> int main(void) { int *p, q; p = &q; /* q のアドレスを得る */ *p = 100; /* ポインタを使ってq に値を代入する */ printf("%d", q); return 0; }

  • 関数にポインタを渡して動的確保する時について

    どうにも動的確保について間違っている気がするのでお尋ねいたします。 よくメモリを動的に確保する場合に私は次のようなプログラムを書きます ポインタを用意する(例えばint *p) mallocでメモリ確保 ポインタを関数に渡す(Func(p)) 関数側でreallocし、値を代入する(p=(int *)realloc(p,sizeof(int)*num)) 関数呼び出し側で、その値を使う しかし、この方法を使うとどうにも関数を呼び出した際のポインタ(p)と、reallocした後のポインタ(p)の値が違うことがあり、値が不定になることがあります。 (reallocのメモリの確保の仕方のせいでしょうか) この使い方は恐らくどこか間違っていると思うんですが、いまいち納得のいく解決策が思いつきません。 例えばポインタを引数ではなく戻り値として得ればできますが、2つ以上のポインタについてはできません。 何卒ご教授のほどをよろしくお願いいたします。

  • 教えてポインタ

    例えば、以下のようなソース。 関数の中で、引数のポインタに値を入れてmainに戻す。 とても簡単なものです。 void func(int *N) {  *N=0; } main {  int  *N=1;  func(N);  printf("%d",*N) } 疑問は、ここからです。 (1)void func(int  *N) (2)void func(int*  N) (3)void func(int*  &N) 上記は、何が違いますか? なお、当方のVS2010で同じソースを作ると、 (1)の場合、エラーになります。(func関数の*N=0のところでダウン) (2)だと、OKになります。 (3)は、なに?