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

您可以尝试使用常量,而不是预编译器定义。

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 + ba = 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 需要一个指针来指向第二个参数。

你必须分配一个指向 memcpy 的指针

const int constant1 = 0x0000;
memcpy(&some_memory_block, &constant1 , 2 );
于 2013-02-16T13:11:15.383 回答