【问题标题】:Arduino array memory usageArduino阵列内存使用
【发布时间】:2012-08-07 17:08:35
【问题描述】:

如果我在全局范围内声明一个数组,它会占用内存来存储它。但是,如果我在函数(例如setup())中声明了一个数组(我使用了两种类型,一种是char数组,另一种是int数组),那么一旦数组用完,内存就会自动释放范围?

我相信某些变量会发生这种情况,例如 int 或 byte。我只是想知道这是否也适用于数组。

另外,由于我读到对于包含大量字符串的程序,最好将它们存储在程序空间中,进行诸如

之类的调用
lcd.print("Hello")

函数结束后仍然会为“Hello”字符串占用内存(假设打印函数没有将它存储在其他地方)?

【问题讨论】:

    标签: c++ arrays string arduino


    【解决方案1】:

    关于第二个问题:

    F() 宏会将字符串存储在程序中,而不是使用RAM,所以你不再有这个问题了:

    lcd.print(F("Hello"));
    

    【讨论】:

    • 所以既然它是一个宏,我只需添加 F() 就可以了?有几个以 _P 为后缀的函数可用于程序存储器。这可以与 LiquidCrystal Library 一起使用吗?
    • 如果您使用 Arduino IDE,我认为这应该适用于您正在使用的任何字符串。试试看吧。
    【解决方案2】:

    关于您的第一个问题: 是的。在函数内部声明的所有变量只在函数内部有效,直到函数返回,然后自动释放。这有一些含义:

    1. 您必须在变量超出范围后(例如,在函数返回后)使用指向本地声明变量的指针。 (不要从你的函数返回一个指向本地数组的指针!) - 然而,当从 inin 声明中调用它们时,将该指针传递给其他函数是完全合法的块/功能。

    2. 局部变量存储在本地堆栈中,因此需要有足够的空间让堆栈在调用函数时增长相应的字节数。

    3. 这些变量使用的内存量在计算“已用”RAM在编译时

    【讨论】:

    • 感谢您提供非常详细和翔实的回答。它比我预期的更详细地回答了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 2021-05-22
    相关资源
    最近更新 更多