C ++で定数をmemcpy()するにはどうすればよいですか?たとえば、次を使用して定数を定義しました
#define constant1 0x0080
したいとき
memcpy(&some_memory_block, constatnt1, 2 );
それは言う
error C2664: 'memcpy' : cannot convert parameter 2 from 'int' to 'const void *'
C ++で定数をmemcpy()するにはどうすればよいですか?たとえば、次を使用して定数を定義しました
#define constant1 0x0080
したいとき
memcpy(&some_memory_block, constatnt1, 2 );
それは言う
error C2664: 'memcpy' : cannot convert parameter 2 from 'int' to 'const void *'
precomiler定義の代わりに、定数を使用してみることができます。
const unsigned short int constant1 = 0x0080;
memcpy(&some_memory_block, &constant1, 2 );
あなたの定数(マクロ)は実際には単なるリテラルです。memcpy
そのため、メモリ位置を期待する別の関数にパラメータとして指定できるアドレスはありません。これを実行したい場合は、他の回答で提案されているように、実定数(など)が必要です。
マクロ(この場合はリテラルの単なるテキスト置換)とは対照的な実定数は、アドレスを取得しない限り、通常はリテラルと機能的に同じです。ただし、そのアドレスを取得することは可能であり、その時点で「通常の」変数のように動作します。つまり、そのアドレスで使用できます。const int
memcpy
ただし、通常は「より正しい」答えは次のとおりです。この種のことはまったく行わないでください。何かが定数である場合、それをコピーするべきではありません(もちろん例外がありますが、通常はコピーすべきではありません)。唯一の正当な理由は、定数値で非定数変数を初期化することですが、それを割り当てるよりも、それを割り当てる方がはるかに簡単memcpy
です。
それ以外の場合、定数のコピーを作成すると、冗長性が追加されるだけで、余分なメモリが無駄に消費され、キャッシュの負荷が増大し、多くのコンパイラの最適化が無効になります。たとえば、コンパイラは、シンボルが定数であることがわかっている場合のようa = b + c - c + b
に、式を簡単に最適化できますa = computed_value_of_2b
(もちろん、はるかに複雑でわかりにくい式も評価されます)。ただし、コンパイラは、いくつかのメモリ位置が指定されたときに実行時に評価するコードを発行する必要があり、他の選択肢はありません。
あなたの場合に起こることは、コードをコンパイルするときにconstant1が0x0080に置き換えられることです。そしてこの行
memcpy(&some_memory_block, constatnt1, 2 );
になります
memcpy(&some_memory_block, 0x0080, 2 );
これ
memcpy
を
見ると、memcpyが2番目のパラメーターへのポインターを必要としていることがわかります。
memcpyへのポインタを割り当てる必要があります
const int constant1 = 0x0000;
memcpy(&some_memory_block, &constant1 , 2 );