如何在c ++中memcpy()一个常量 例如,我使用
定义了一个常量#define constant1 0x0080
当我想要
时memcpy(&some_memory_block, constatnt1, 2 );
它说
error C2664: 'memcpy' : cannot convert parameter 2 from 'int' to 'const void *'
答案 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 + b
到a = 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 );