2016-07-13 10 views
-2

私が型キャストしない限り、voidポインタを参照解除することはできません。Cでサイズを使ってvoidポインタを参照解除する

void *ptr = call_a_function(); 
printf("%d",*(int *)ptr); 

これは、(この場合、その整数)コンパイラへの要素のデータ型を通知することができるように(この場合、その4バイト)、それに必要なスペースの量を間接参照。

私は最終的なデータ型を知りませんが、私はデータ型のサイズを知っています。私はまだ、データ型(intを使用しない)ではなく、サイズ(4バイト)のみを使用して逆参照できますか?

言い換えれば、抽出するバイト数を指定してデータ型ではなく、読み込むメモリのバイト数をコンパイラに指示する方法がありますか?私は2つのvoid *型のポインタの内容をスワップするために必要な

-

EDIT

2つの値を交換する通常の方法、つまり一時変数に1つのポインタの値を格納してからスワップすることによって影響を受けます。

データ型を知らずに同じサイズを試みようとしましたが(このスワップコードを持つ関数は変数のサイズを1つのパラメータとして受け入れるためです)。しかし、答えとコメントを読んだ後、私はそれを間接参照する必要はないことを認識しなければなりません。恐らくmemcpyは正しい方法です。

+0

'* p;'のようにそれ自身を逆参照しても実際には何もしません。逆参照されたポインタを使って、正確に何をするつもりですか?それを他のものに割り当てますか?それに他のものを割り当てますか?コンパイラは、適切なコードを生成するために型を知る必要があります。 – fredoverflow

+1

voidポインタが変数を指しているところで、データを 'memcpy 'することができます。それが役立つかどうかは分かりません... – yellowantphil

+0

voidポインタを間接参照するのに役立つものは何ですか?通常、charポインタと\ 0で終わらない限り、その大きさは分かりません。 memcpyアクションとmemsetアクションでnバイトを抽出するようにシステムに指示することはできますが、そうするために逆参照する必要はありません。 –

答えて

1

私は最終的なデータ型を知りませんが、私はデータ型のサイズを知っています。私はまだ、データ型(intを使用しない)ではなく、サイズ(4バイト)のみを使用して逆参照できますか?

データ型を推測したり仮定したりすることはできないため、完全なオブジェクトを取得するためにポインタを逆参照できません。ただし、各バイトを抽出して、必要に応じて使用することができます。

void *ptr = call_a_function(); 
unsigned char* cptr = (unsigned char*)ptr; 
for (int i = 0; i < num_bytes; ++i) 
{ 
    unsigned char c = cptr[i]; 
    // Use c 
} 
+0

'unsigned char'は未知のソースタイプの未知のデータでいくつかの利点があります。 – chux

+1

@chux、私はあなたに同意する傾向があります。いくつかの人は、それがすべての実用的な目的のために何の違いもないと考える。 –

0

この場合、全体がその部分の合計ではありません。キャストは、コンパイラにデータのサイズだけでなく、そのデータがどのように解釈されるかを提供します。 4バイトを取得したとします。これは、NULLバイトまたは符号付き整数の3文字の文字列であり、プラットフォームに応じてビッグエンディアンまたはリトルエンディアンでエンコードできます。コンパイラに読み込み/参照解除のバイト数を伝えることができたとしても、サイズを知ることでデータを適切に処理するには十分ではありません。

関連する問題