2017-08-10 5 views
-2
char mem[8]; 
uint64_t *memory{(uint64_t*)(void*)&mem[0]}; 
std::cout << "diff: " << (void*)memory - (void*)(&mem[0]) << std::endl; 

簡単な例、GCCとのエラーメッセージは次のとおりです。無効なC++の使用はなぜですか?

error: invalid use of ‘void’ 
std::cout << "diff: " << (void*)memory - (void*)(&mem[0]) << std::endl; 
+1

あなたは何をしようとしていますか? 'char []'を単一の 'uint64_t'として再解釈しますか? – CoryKramer

+2

'void *'に対してポインタ演算を行うことはできません。 – Kevin

+0

@CoryKramerうん、かなり 'char []'を 'uint64_t'配列に変換しようとしています。私はそれが簡単だろうと思ったが、これは私を困惑させてしまった... – user3728501

答えて

1

ボイドの無効な使用、なぜ?

void*(このポインタに格納されているアイテム)のサイズは不明です。

std::cout << "diff: " << (uint8_t*)memory - (uint8_t*)(&mem[0]) << std::endl;

+0

途中で '(uint64_t *)'に変換するとどうなりますか?私の仮定は、違いはまだ同じで、バイト単位で測定されるでしょうか? – user3728501

+0

@ user3728501これは、底に丸められた 'uint64_t'(8バイト)の距離を測定します。例えば、距離 '2 bytes'は' 0 uint64_t' – ikleschenkov

+0

"2バイトは0 uint64_tになります" - これは意味をなさないでしょうか? – user3728501

0

:あなたはバイト単位でのポインタの間の距離を計算したい場合は

は、何か1バイトの大きさ(のchar *、unsigned char型の*、uint8_tの*など)のポインタにそれらをキャストvoidポインターでポインター演算を実行することはできません - hereを参照してください。これは、定義された「サイズ」を持たないvoidが原因です。 int *xとすると、x+1は、のアドレスに沿ってさらにsizeof(int)バイトになることがわかります。

また、hereをテストすることもできます。-のいずれかの式を削除するとコンパイルできます。

関連する問題