私が型キャストしない限り、voidポインタを参照解除することはできません。Cでサイズを使ってvoidポインタを参照解除する
void *ptr = call_a_function();
printf("%d",*(int *)ptr);
これは、(この場合、その整数)コンパイラへの要素のデータ型を通知することができるように(この場合、その4バイト)、それに必要なスペースの量を間接参照。
私は最終的なデータ型を知りませんが、私はデータ型のサイズを知っています。私はまだ、データ型(intを使用しない)ではなく、サイズ(4バイト)のみを使用して逆参照できますか?
言い換えれば、抽出するバイト数を指定してデータ型ではなく、読み込むメモリのバイト数をコンパイラに指示する方法がありますか?私は2つのvoid *型のポインタの内容をスワップするために必要な
-
EDIT。
2つの値を交換する通常の方法、つまり一時変数に1つのポインタの値を格納してからスワップすることによって影響を受けます。
データ型を知らずに同じサイズを試みようとしましたが(このスワップコードを持つ関数は変数のサイズを1つのパラメータとして受け入れるためです)。しかし、答えとコメントを読んだ後、私はそれを間接参照する必要はないことを認識しなければなりません。恐らくmemcpy
は正しい方法です。
'* p;'のようにそれ自身を逆参照しても実際には何もしません。逆参照されたポインタを使って、正確に何をするつもりですか?それを他のものに割り当てますか?それに他のものを割り当てますか?コンパイラは、適切なコードを生成するために型を知る必要があります。 – fredoverflow
voidポインタが変数を指しているところで、データを 'memcpy 'することができます。それが役立つかどうかは分かりません... – yellowantphil
voidポインタを間接参照するのに役立つものは何ですか?通常、charポインタと\ 0で終わらない限り、その大きさは分かりません。 memcpyアクションとmemsetアクションでnバイトを抽出するようにシステムに指示することはできますが、そうするために逆参照する必要はありません。 –