如何memcpy()一个常量

时间:2013-02-16 13:06:06

标签: c++ visual-c++

如何在c ++中memcpy()一个常量 例如,我使用

定义了一个常量
#define constant1 0x0080

当我想要

memcpy(&some_memory_block, constatnt1, 2 );

它说

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

3 个答案:

答案 0 :(得分:4)

您可以尝试使用常量,而不是预处理程序定义。

const unsigned short int constant1 = 0x0080;
memcpy(&some_memory_block, &constant1, 2 );

答案 1 :(得分:2)

你的常量(宏)实际上只是一个文字。因此,它没有可以作为memcpy的参数或期望内存位置的另一个函数给出的地址。如果你想这样做,你需要有一个实常数(例如const int),如其他答案所示。
与宏相对的实常数(只是文本替换,在本例中为文字)通常在功能上与文字相同,只要您不接受其地址即可。但是,可以采用其地址,此时它的行为类似于“正常”变量。这意味着您可以在其地址上使用memcpy

然而,通常“更正确”的答案是:不要做这种事情。如果某事是常数,你不应该复制它(当然有例外,但通常你不应该)。唯一合理的原因是你需要一个常量值来初始化一个非常量变量,但是分配它比分析memcpy要容易得多。

制作常量副本只会增加冗余,在没有任何好处的情况下消耗额外的内存,增加缓存压力,并且会使许多编译器优化失败。例如,如果编译器知道符号是常量,那么编译器可以简单地优化像a = b + c - c + ba = computed_value_of_2b这样的表达式(当然,更复杂和不太明显的表达式也被评估)。但是,编译器必须发出在给定一些内存位置时在运行时进行求值的代码,它没有其他选择。

答案 2 :(得分:0)

在您的情况下,当您编译代码时,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 );