如何记住()一个常量
how to memcpy() a constant
如何在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 + b
到a = 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 );
相关文章:
- 用C++中的一个变量定义一个常量
- 从另一个常量标准::映射初始化一个常量标准::映射的一部分
- isdigit() 和 isalnum() 给出错误,因为输入是一个常量字符并且无法转换。其他可能查看输入是否为数字的方法?
- C++ 在 none 常量指针函数中返回一个常量指针
- 为什么重载"<<"需要一个常量参数?
- 为什么它是一个常量指针而不是指向常量指针
- 是一个常量句柄真的常量
- 将一个常量cstring附加到我自己的String类对象
- C++在类构造函数中定义了一个常量成员变量
- G++抱怨constexpr函数不是一个常量表达式
- 是一个常量字符串Still Preferrable
- 返回一个常量字符 *
- 将一个常量未签名的长流流式传输到流
- 从自定义 printf 函数返回一个常量字符*
- C++做虚函数总是必须是一个常量
- 我想将一个常量字符串写入包含另一个输入数据块的文件
- 如何计算初始化一个常量数组(制作常量查找表)
- C++:在初始化列表中传递一个常量 *p
- 我可以在 protobuf 中定义一个常量字符串吗?
- 初始化一个常量变量,如果失败则断言(c++)