• ベストアンサー

Voidポインタで受け取った変数の型を調べる方法

あるライブラリの関数を利用しようとしたのですが、その関数の引数にVoidポインタがあり、どういう型のデータを格納したのかわかりません。このポインタのアドレスに格納されたデータの型を調べる関数なり方法なりというのはあるのでしょうか。 Voidポインタというのは型を問わずに受け取れるというのは利点ですが、受け取ったものがあらかじめなんだかわからない場合はどうするのでしょうか。よろしくお願いします。

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

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★基本的に調べようがありません。 ・『void』ポインタはアドレス情報のみを受け渡しますので、型のサイズまでは分かりません。  逆に言えば、型のサイズが分からないから『汎用ポインタ』と呼べるのです。 ・あるライブラリの関数とは何?→どんな関数か分かりませんので、これ以上はアドバイス無理!  ただ、C言語の qsort などでは比較用の関数で『void』ポインタを受け取りますが、その関数内で  渡されたデータの『型』を指定します。→ポインタの形でキャストします。  この比較用の関数は自前で用意する関数ですので、ソートするデータの型が分かっています。  でも、ソートするデータ型が複数ある場合は、比較用の関数を複数作って切り替えます。 ・あと関数に型を表す引数があれば、それを見て判断できますが、そうでない場合は『void』ポインタで  渡される前の『型』の調べることは不可能です。→言語仕様より。 ・以上。参考に。→一応、あるライブラリの関数とは何?

subarist00
質問者

お礼

すみません。Voidではなくvoidです。 やはり、データの既知でないとしょうがないのですね。わからない前提で動作するものを作ろうと思っていまたのですが、それは不可能とわかっただけでもありがたい事です。 有難うございました。

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

その他の回答 (2)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

voidではなくVoidですか?その型の定義がどうなっているのか補足してください。 > あるライブラリの関数を利用しようとしたのですが、 ライブラリの関数を利用するのであれば、質問者さんは受け取る立場のコードを書くのではなく、渡す立場のコードを書くのでは?渡す側であれば、自分がどんな型の引数を渡したかわかるはずです。実際はどうなのでしょうか?

subarist00
質問者

お礼

すみません。Voidではなくvoidです。 やはり、データの既知でないとしょうがないのですね。わからない前提で動作するものを作ろうと思っていまたのですが、それは不可能とわかっただけでもありがたい事です。 有難うございました。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

その関数の仕様を調べればわかると思うんだけど....

subarist00
質問者

お礼

ご回答ありがとうございます。

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

関連するQ&A

  • C言語のvoid型ポインタ変数について。

    C言語のvoid型ポインタ変数について。 C言語のvoid型ポインタ変数について質問があります。 組み込み系の開発を行っているのですが、現在使用しているシステムで、 提供されている "API" を介してアプリケーション部のソフト作成を行っています。 この "API" ですが、引数の多くはvoid型ポインタとなっています。 ある人がこの引数がvoid型となっているのを見て、 『なんでvoid型なんや??、C言語でアセンブラと違うんやから、void型なんかにしない方が良い』 とおっしゃいました。 この意味がよくわからなかったのですが、なぜ void型はよろしくないんでしょうか? -- 僕が思うに、APIなんやから引数を void型ポインタ にすることでどんな型にも対応できる 汎用的であると感じ、逆にこの方が良いのではと感じたのですが。。 -API例---- int _exApiKannsuu( char in_data, void* out_data ) "in_data" をもとに "out_data" を取得する。 どーやらこの "out_data" が void型 であるのががよくないらしい・・

  • C言語のvoid型ポインタを使いたいのですが…

    C言語のvoid型ポインタを使いたいのですが… 関数の引数として、void型ポインタを使おうと思ったのですが、内部でどのように処理すればいいのかわかりません キャストすれば問題なく使えるとのことですが、どの型でキャストするのかをどのように判断するのかがわかりません 具体的には、画像処理で画像の構造体をいくつか作ったのですが、それぞれの構造体ごとに関数を書くと関数が多くなるので、void型ポインタでまとめてつくろうとしています どのように型の判断を行えばいいのかを教えてください

  • 関数ポインタを返す関数の型をtypedefする方法

    C言語について質問します。 ある関数を定義するとします。 その関数は引数としてintを一つ取り、返値としてその関数と同じ型の関数へのポインタを返すようにしたいのですが、どのように書けばよいのでしょうか? そして、その関数の型をtypedefで定義したいです。 例えば、FNをtypedefしたいその関数の型だとすると、 typedef FN (*FN)(int); のようなFNを定義したいのですが、上のように書いても当然コンパイラ(VC9)に怒られます。 最悪、 typedef void* (*FN)(int); とvoidポインタを返すように定義しておいて、そのポインタを返値として受け取った側でFNにキャストし直す方法で対処できなくもないですが、ちょっと強引過ぎる気がします。 何かいい方法はあるのでしょうか? boost::functionあたりを使えばできそうな、そうでもないような気がしますが、できれば純粋なCでの解決法を望みます。 よろしくお願いします。

  • voidポインタ

    曖昧な質問になってしまいますが、voidポインタを使うことによって どのような利点があるのかが解りません、あらゆるポインタ型から キャスト可能だということは解るのですが、具体的な使用方法がわかりません よろしくお願いします。

  • void型へのポインタ

    というのがC言語にありますよね? このvoid型へのポインタというのは、 どのようにイメージすればいいのでしょうか? 例えばchar型へのポインタなら、 指している領域は 1バイトの領域ですよね? ではvoid型は? また malloc関数を 使って char *p; p=(char *)malloc(1000); とするとでchar型にキャストしているから、 1個1バイト分の領域が1000個用意して、 先頭アドレスをpに格納するのですよね? では、 int *q; q=(int *)malloc(1000); としたら、用意されるのは、int型にキャストしているから 1個2バイト分の領域が500個用意されるのでしょうか? お願いします。

  • C言語:void*の指す型の比較をする方法

    C言語において、Java言語で言うところのinstanceof演算子の様な、方の比較をする演算子、もしくは、その方法をご存知でしたら教えていただきたく思います。つまり、   void型のポインタ変数x   void *x = (何とかのアドレス); となっている時、xの指す型・構造体を知りたいのです。 問題の解決方法・アドヴァイスを宜しくお願いします。 私は現在 void *function(..., ...); という関数を作り、それは処理に応じて,A構造体へのポインタ、B構造体へのポインタ又は、NULLを返します。そして、 void *tmp = function(..., ...); を作りました。tmpがAを指している時、Bを指している時、NULLとなっている時、それぞれに合わせて異なった処理をしたく思っています。そのためには、tmpがどの構造体又は、NULLを指しているのかが分からないといけません。その方法が分からず困っています。

  • 不透明なデータのポインタ宣言

    ライブラリ内で使用し、ライブラリの外には、 中身を公開したくない構造体があります。 ライブラリ関数には必ず、ポインタとしてやりとりされます。 これを外部向けに不透明なデータのポインタとして宣言したいのですが・・ typedef const void *PRIVATE_DATA ; このように宣言してみたのですが、 これでは、否応にもvoidポインタとなってしまい、 char *等と暗黙のキャストが行われてしまいます。 たとえば・・ int lib_func( PRIVATE_DATA priv ) ; こんなライブラリ関数に対して、 lib_func( "HELLO" ) ; こんなおかしな呼び出し方が書けてしまいます。 不透明で、他の型へ暗黙のキャストが行われないポインタの宣言の仕方って、 ありませんでしょうか。。? ちなみに、コンパイラは gcc version 3.4.4 です。

  • 関数の引数をvoid*でキャストする

    最近見かけたCのプログラムで、関数の引数の型は void* なのですが、その関数を使うときに 引数をvoid*でキャストしていました。 例えば、 func ( (void*) p ); こういうことです。 私の知っている知識では、 void* と 任意の型のポインタは キャストなしに相互に代入可能です。 関数の引数でも、キャストは要らないものだと思っていました。 そうすると、引数を void* でキャストするのは無意味だと思うのですが、・・・ 違うのでしょうか。処理系によるとか。 逆に、関数の引数の型がchar*などで、渡すものが void* のときはどうなのでしょうか。 下のプログラムは、関数byte_orderの引数の型はvoid*ですが、int型へのポインタ( &a )を設定しています。私の環境では、コンパイルエラーも警告もないし、動作も正常です。 #include <stdio.h> #include <string.h> void byte_order(void *vp) { char char_array[4]; strncpy(char_array, vp, 4); printf("出力します:%x %x %x %x\n", char_array[0], char_array[1], char_array[2], char_array[3]); } int main(void) { int a = 0x12345678; byte_order(&a); return 0; } このプログラムは単なる一例であって、質問はバイトオーダに関するものではありません。 また、C言語の質問であって、C++ではありません。

  • void*型の配列について

    void* a[2]; void* b = a; void* c[2] = (void *[2])b; error C2440: '型キャスト' : 'void *' から 'void *[2]' に変換できません。 配列型への変換はありませんが、参照またはポインタから配列への変換があります。 void*型にした a を再度void*型の配列に戻すにはどのように記述すればよいでしょうか? 環境はXP(SP3)のVS2008 MFC です。 宜しくお願いいたします。

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

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

DNA、カルス培養について
このQ&Aのポイント
  • DNA、カルス培養とは ー 生物の細胞増殖の方法
  • 植物では「カルス培養」と呼ばれ、苗作りに使用される
  • 動物では「細胞培養」と呼ばれ、大型の動物では元の生物の再現はできない
回答を見る

専門家に質問してみよう