C 使用列表语法强制运行时数组分配和初始化

C 使用列表语法强制运行时数组分配和初始化,c,arrays,memory,memory-management,atmega,C,Arrays,Memory,Memory Management,Atmega,我正在开发一款atmega328,它只有2K的RAM 我使用脚本从10个位图创建10字节数组,这些位图代表我的LCD计时器的10位数字。这些字节数组存储在我的源代码中,但由于我一次只写一个数字,因此没有理由将它们全部保存在RAM中。这样我可以使用更大的数字,消耗更少的RAM 这就是我想做的: void load_digit_ba(uint8_t digit, uint8_t digit_ba[]) { // from 0 to 9 I copy the current digit in t

我正在开发一款atmega328,它只有2K的RAM

我使用脚本从10个位图创建10字节数组,这些位图代表我的LCD计时器的10位数字。这些字节数组存储在我的源代码中,但由于我一次只写一个数字,因此没有理由将它们全部保存在RAM中。这样我可以使用更大的数字,消耗更少的RAM

这就是我想做的:

void load_digit_ba(uint8_t digit, uint8_t digit_ba[]) {

  // from 0 to 9 I copy the current digit in the byte array form into digit_ba
  if (digit == 0) {
    uint8_t digit_ba_tmp[10] = { 24, 40, 0, 0, 0, 224, 240, 248, 252, 254 };

    memcpy(digit_ba, digit_ba_tmp, 10);
  }
...

}
但编译器似乎在静态地为所有数组保留内存。在我的例子中,122字节*10位=~1K,占我RAM的一半以上

Sketch uses 7,310 bytes (23%) of program storage space. Maximum is 30,720 bytes.
Global variables use 1,695 bytes (82%) of dynamic memory, leaving 353 bytes for local variables. Maximum is 2,048 bytes
如果我向数组[11]而不是[10]添加一个单元格,并将10值作为初始值传递,那么它将在运行时分配内存(看起来):

奥迪诺·艾德说:

Sketch uses 11,396 bytes (37%) of program storage space. Maximum is 30,720 bytes.
Global variables use 597 bytes (29%) of dynamic memory, leaving 1,451 bytes for local variables. Maximum is 2,048 bytes.
同样的行为如果我让编译器计算长度,它会保留~1K RAM

为什么要添加一个单元格呢?它干净吗?在我看来不是。
这里的假设是,由于数字数组的长度对于每个数字都是固定的,只需更改内容,并且我每次通过串行方式向显示器发送一个数字,因此只需将当前数字加载到ram中,然后发送它就有意义了。我在这里没有看到任何堆/堆栈内存碎片问题,对吗?smiley sad

如果你制作数据数组
const
,是否会将它们从RAM移动到代码中(ROM或flash或其他)?不确定它是如何工作的,但这里没有什么神奇之处,当你访问数组时,它就在RAM中,关键是何时加载?只读内存中的某个地方有一个副本,它被复制到RAM中的
digital\u ba\tmp
以初始化变量,然后再复制到
digital\u ba
。如果你说:
staticconstuint8digital\u ba\u tmp[11]={…}
在将其复制到
Digital_ba
之前,您可能会避免将其复制到RAM中。我明白您的意思,不确定您是否正确,但您可能是对的。我完全不能保证我是正确的(这是这些是注释而不是答案的原因之一);我已经很长一段时间没有使用过2kib内存的设备了(哎哟,30多年了!)。
Sketch uses 11,396 bytes (37%) of program storage space. Maximum is 30,720 bytes.
Global variables use 597 bytes (29%) of dynamic memory, leaving 1,451 bytes for local variables. Maximum is 2,048 bytes.