【问题标题】:memcpy - taking the address of temporary array errormemcpy - 获取临时数组错误的地址
【发布时间】:2021-11-05 01:57:12
【问题描述】:

我正在研究 Arduino 并尝试更改数组的元素。在设置之前,我像这样初始化数组:

bool updateArea[5] = { false };

然后我想像这样更改数组:

updateArea[0] => false,
updateArea[1] => true,
updateArea[2] => false,
updateArea[3] => false,
updateArea[4] => true

通过使用:

memcpy(&updateArea[0], (bool []) {false, true, false, false, true}, 5);

但是,我得到“临时数组的获取地址”错误。

我也尝试在设置和循环函数中初始化数组,但得到了同样的错误。

【问题讨论】:

  • Arduino 不在 C 中。它在 C++ 中。
  • 这能回答你的问题吗? C++ error: "taking address of temporary array"
  • @KamilCuk,这在 C 语言中有什么不同吗?
  • @Juraj 是的,这段代码可以用 C 编译,但不能用 C++ 编译。
  • 你的编译器是什么? “复合文字” 不是 临时变量,而是未命名的局部/全局变量。它是编译器错误吗?

标签: c++ arduino memcpy


【解决方案1】:

这种语法在 C 中有效,但在 C++ 中无效 - 这是 Arduino IDE 的底层语言。

但您有一些简单的解决方案:

  • 既然你愿意写出数组,为什么不干脆:

    bool updateArea[5] = {false, true, false, false, true};
    
  • 您可以将数组声明为非临时数组,然后将其传递给memcpy

    static const bool newArray[5] = {false, true, false, false, true};
    memcpy(updateArea, newArray, sizeof(updateArea));
    
  • 如果您可以假设 sizeof(bool) == 1,那么您可以使用这个 hacky 解决方案:

    memcpy(updateArea, "\x00\x01\x00\x00\x01", sizeof(updateArea));
    

    这将直接复制字节。

【讨论】:

  • 将 newArray 声明为 static const 可能更好,因此代码生成(可能)更有效。否则编译器可能会在每次调用函数时初始化这个临时变量,然后复制它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多