【问题标题】:Arduino Char Array Mapping OverlapArduino 字符数组映射重叠
【发布时间】:2014-09-29 01:52:34
【问题描述】:

我试图将字符串传递给 c 中的函数,出于某种原因,即使我没有为变量设置值,但它已经拥有另一个变量的值,如果我更改它,更改似乎覆盖另一个变量。代码如下:

void reverse(char *s, char *reverse)
{
  uint32_t length = str_length(s);
  Serial.println(reverse);
  Serial.println(s);
  for (uint32_t i = 0; i < length; i++)
  {
    Serial.print(length - i - 1);
    Serial.println(s[length - i - 1]);
    reverse[i] = s[length - i - 1];
  }
  for (uint32_t i = 0; i < length; i++)
  {
    Serial.print(i);
    Serial.println(s[i]);
  }
  reverse[length] = '\0';
  Serial.println(reverse);
}

char* readstring()
{
  char s[128]; 
  readline(s, 128);
  return s;
}

char* str_reverse(char *r)
{
  char rev[128];
  reverse(r, rev);
  return rev;
}

readstring() 在代码的前面被调用并成为str_reverse 中的参数 r。如果我输入 face 作为我的字符串,这是输出:

face
face
3e
2c
1c
0e
0e
1c
2c
3e
ecce

为什么要把字符串映射到同一个内存槽?

【问题讨论】:

    标签: c char arduino


    【解决方案1】:

    代码中的一个主要问题是如何在readstring()str_reverse() 中创建数组srev。这两个实例都在被调用函数(它们各自的函数)的堆栈中创建,并在返回时被释放。自动“释放”(根据语言规范,生命周期结束)将允许新功能为其堆栈重用相同的内存。这给了你重叠的错觉。

    为了您的测试,要查看代码中的其他问题,请将这些数组用作 static 或全局。

    【讨论】:

    • 好的,这解释了读取重叠,但是 r 返回到主函数(并存储),然后在 str_reverse 中使用了一个参数,那么为什么在我修改反向时它被修改?
    • 虽然 make s global 确实解决了我的问题,但还是谢谢你的解决方案。
    • 我们可以花时间了解为什么会发生这样的事情,但是当它是对语言的误用/误解的结果时,它真的不是很有用。一旦你从函数中返回,你就不能授权在函数中声明的自动变量会发生什么(即放置在它的堆栈中)。
    • 即使它被存储了,如果返回被再次存储在调用堆栈的较低位置?
    • 您不能在您返回时授予数据的有效性。细节可能取决于实现细节,但这绝对是不对的。我会做什么,分配(或在你的 main 中使用自动变量)但将它传递给你的函数,它将为你填充它。另外,请注意static 变量或全局变量会使函数不是多线程安全的(不可重入)。
    猜你喜欢
    • 2012-01-23
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 2013-06-15
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    相关资源
    最近更新 更多