2017-10-02 26 views
0

私はfloat型変数のメモリアドレスとバイト/ char配列を埋めるためにしようとしている(配列の長さは4バイト=ポインタである)、しかし何でも私は、それはアドレスの代わりになってfloat値を保持します。それをデバッグmemcpyで使用するfloatアドレスを取得するには?

float f = 20.0f; 

memcpy(data, &f, sizeof(data)); 

printf("Array: %#X, %#X, %#X, %#X", data[0], data[1], data[2], data[3]); 

... 16進形式浮動小数点値(20.0)を与える:

Array: 0, 0, 0XA0, 0X41 

私は必要なものフロートのメモリアドレスです。それはデータへのポインタを取るそれがコピーされます:私は

+1

興味がありますが、どうして必要なのですか? – BLUEPIXY

答えて

5

memcpy作品はどのようにそれはだ...いくつかの異なった方法でそれをデリファレンス/キャストしようとしたが、それは仕事を得ることができません。あなたのデータ floatへのポインタであるので、あなたはフロートへのポインタへのポインタを渡す必要があります:

#include <cstring> 

int main() { 
    float f = 20.0f; 
    float* pf = &f; 
    char data[sizeof(pf)]; 
    memcpy(data, &pf, sizeof(data)); 
} 
+0

たぶんあなたはまた、64ビットマシン(今日、一般的)でポインタが8文字/バイトかかる必要があることを言及する必要があります。 –

+0

@Bob__:確かに、ありがとう! Zax Ftw:上記を読んで、一般的にあなたが別の質問でやっていることをよく説明し、それが良いことであるかどうか尋ねてください –

+0

これは32ビット用ですから、ポインタは4バイトです。完全に無関係でニッチなものだからです。 –

0

Cソリューションについて、リテラル化合物に進データを保存します。

#include <stdio.h> 

int main(void) { 
    char data[sizeof (float*)]; 
    printf("%p\n", (void*) data); 
    float f; 
    printf("%p\n", (void*) &f); 

    memcpy(data, &(float *){&f}, sizeof (float*)); 
    for (unsigned i = 0; i<sizeof data; i++) { 
    printf("%02hhX ", data[i]); 
    } 
    puts(""); 
} 

出力

0xffffcba8 
0xffffcba4 
A4 CB FF FF 00 00 00 00 

アドレスは、ブロックの終わりまで有効です。
必要に応じてエンディアン/プリント順序を調整します。

+0

なぜこの化合物がC++でコンパイルされないのか不思議です。私はこの1行のソリューションが本当に好きですが、あまりにも多くの括弧のエラーを取得します。 –

+0

@ ZaxFtw IIRCでは、C++は_compound literal_をサポートしていません。 [複合リテラル標準C++ですか?](https://stackoverflow.com/q/28116467/2410359)を参照してください。 – chux

関連する問題