1

C ++で定数をmemcpy()するにはどうすればよいですか?たとえば、次を使用して定数を定義しました

#define constant1 0x0080

したいとき

memcpy(&some_memory_block, constatnt1, 2 );

それは言う

error C2664: 'memcpy' : cannot convert parameter 2 from 'int' to 'const void *'
4

3 に答える 3

4

precomiler定義の代わりに、定数を使用してみることができます。

const unsigned short int constant1 = 0x0080;
memcpy(&some_memory_block, &constant1, 2 );
于 2013-02-16T13:09:48.203 に答える
3

あなたの定数(マクロ)は実際には単なるリテラルです。memcpyそのため、メモリ位置を期待する別の関数にパラメータとして指定できるアドレスはありません。これを実行したい場合は、他の回答で提案されているように、実定数(など)が必要です。 マクロ(この場合はリテラルの単なるテキスト置換)とは対照的な実定数は、アドレスを取得しない限り、通常はリテラルと機能的に同じです。ただし、そのアドレスを取得することは可能であり、その時点で「通常の」変数のように動作します。つまり、そのアドレスで使用できます。const int
memcpy

ただし、通常は「より正しい」答えは次のとおりです。この種のことはまったく行わないでください。何かが定数である場合、それをコピーするべきではありません(もちろん例外がありますが、通常はコピーすべきではありません)。唯一の正当な理由は、定数値で非定数変数を初期化することですが、それを割り当てるよりも、それを割り当てる方がはるかに簡単memcpyです。

それ以外の場合、定数のコピーを作成すると、冗長性が追加されるだけで、余分なメモリが無駄に消費され、キャッシュの負荷が増大し、多くのコンパイラの最適化が無効になります。たとえば、コンパイラは、シンボルが定数であることがわかっている場合のようa = b + c - c + bに、式を簡単に最適化できますa = computed_value_of_2b(もちろん、はるかに複雑でわかりにくい式も評価されます)。ただし、コンパイラは、いくつかのメモリ位置が指定されたときに実行時に評価するコードを発行する必要があり、他の選択肢はありません。

于 2013-02-16T13:26:38.830 に答える
-1

あなたの場合に起こることは、コードをコンパイルするときに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 );
于 2013-02-16T13:11:15.383 に答える