【问题标题】:Write char array to specific memory-address将 char 数组写入特定的内存地址
【发布时间】:2017-01-13 20:46:38
【问题描述】:

我有一个巨大的字节数组(char 数组),我用它来写入另一个地址。 例如

char myBytes[] = { 0x43, 0x31, 0x63 };//just an example
(char*)0x123456 = &myBytes;

但问题是我收到一个错误提示

"expression must be a modifiable lvalue"

我已经尝试了一些其他的东西,比如

char myBytes[] = { 0x43, 0x31, 0x63 };//just an example
*(char*)0x123456 = myBytes;

但我得到了同样的错误。我做错了什么,我能做些什么来完成我想要完成的事情?

【问题讨论】:

  • memcpy((char*)0x123456, myBytes, sizeof(myBytes)); 坏主意,虽然...
  • (char*)0x123456char * 类型的常量。你不能分配给它,就像你不能分配给值1一样。
  • @EugeneSh.,你为什么这么肯定这是个坏主意?
  • @SergeyA 在 C 或 C++ 中使用显式地址仅在非常特殊的情况下是合理的,而我不太确定 OP 是否如此。即使在这些情况下,通常也有其他方法。
  • @EugeneSh.,显然,您从未使用过 MCU,是吗?

标签: c++ arrays memory byte memory-address


【解决方案1】:

您不能在 C++ 中使用 = 分配数组。像这样使用时,数组名称会衰减为指针,因此您试图将数组的地址写入内存位置。使用memcpy()复制内存。

memcpy((void*)0x123456, (void*)mBytes, sizeof(mBytes));

【讨论】:

  • 不仅数组 name 衰减为指针,any 数组值在计算时也会衰减为指针。因此,您甚至无法使用诸如*(char(*)[3]) myBytes 之类的技巧来获取数组的句柄——取消引用产生的数组值只会衰减回指针。
  • @JohnBollinger 并非每次评估都会发生“衰减”。它仅在上下文需要衰减时发生(这是大多数上下文,但不是全部)。例如在&myBytes 中没有衰减,数组结果的地址。在您的示例中(与*&myBytes 相同),& 运算符可以应用于结果。
  • @M.M,可以肯定的是,这是一个很好的点,但是评估表达式 &myBytes,不涉及 评估myBytes 指定的数组,因此数组不会衰减为指针。这(以及我之前的评论)与您所说的一致。我喜欢这种思考方式,因为它的优点是需要更少的异常,但它确实有点微妙。
  • @JohnBollinger & 计算其操作数。除非标准明确规定它是未计算的操作数,否则每个操作数都会被求值。 sizeof 是这样,& 不是这样。考虑代码&foo();如果& 没有评估其操作数,则不会调用该函数。
  • @M.M,好点,我看到这是 C++ 和 C 不同的一个领域。在 C++ 中,对函数调用表达式求值的结果在某些(但绝不是全部)情况下是左值。据我所知,评估 C 函数调用的结果绝不是左值。当它不是左值时,函数调用表达式的结果不是任一语言中& 运算符的允许操作数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
相关资源
最近更新 更多