如何记住()一个常量

how to memcpy() a constant

本文关键字:一个 常量 何记住      更新时间:2023-10-16

如何在c中memcpy()常量++例如,我用定义了一个常数

#define constant1 0x0080

当我想时

memcpy(&some_memory_block, constatnt1, 2 );

上面写着

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

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

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

您的常量(宏)实际上只是一个文字。因此,它没有可以作为参数提供给memcpy或期望存储器位置的另一个函数的地址。如果你想这样做,你需要有一个实常数(如const int),正如其他答案中所建议的那样
与宏(在本例中,宏只是文字的文本替换)相反,实数常量通常在功能上与文字相同,只要你不取它的地址。然而,可以获取它的地址,在这一点上,它的行为就像一个"正常"变量。这意味着您可以在其地址上使用memcpy

然而,通常"更正确"的答案是:根本不要做这种事。如果某个东西是常量,你不应该到处复制它(当然也有例外,但通常你不应该)。唯一有效的原因是您想要一个常数值来初始化一个非常变量,但这样只分配它比分配给memcpy要容易得多。

否则,复制常量只会增加冗余,毫无益处地消耗额外的内存,增加缓存压力,并使许多编译器优化失败。例如,如果编译器知道符号是常数,那么它可以简单地优化像a = b + c - c + ba = computed_value_of_2b这样的表达式(当然,也会评估更复杂和不太明显的表达式)。然而,编译器必须发出在给定某些内存位置时在运行时求值的代码,它别无选择。

在编译代码时,发生的情况是constant1被0x0080替换。这条线

memcpy(&some_memory_block, constatnt1, 2 );

成为

memcpy(&some_memory_block, 0x0080, 2 );

这个


如果您查看memcpy,您会发现memcpy需要第二个参数的指针。

你必须输入一个指向内存的指针

const int constant1 = 0x0000;
memcpy(&some_memory_block, &constant1 , 2 );