我正在编写一个需要测试一些外部SPI闪存的功能。 在开发过程中意外,我使用了这段代码
void __TO_FLASH__ slcTestCache(uint8_t len)
{
uint16_t wcrc = 0xFFFF, rcrc = 0xFFFF;
uint8_t wbuff[len], rbuff[len];
//uint8_t *wbuff = os_malloc(len);
//uint8_t *rbuff = os_malloc(len);
...
请注意' len'是争论。 现在代码按预期工作(我测试了一些参数),但我的问题是正确的吗?
我的意思是
uint8_t wbuff[len]
编译器怎么可能知道len是@runtime来调整缓冲区的大小? 评论的代码似乎更符合逻辑(malloc)。
现在问题是代码是否有效,我更喜欢不使用malloc(嵌入式原因)。或者只是偶然运行该区域的堆栈是免费的。
感谢您的澄清(我使用gnu c99)。
答案 0 :(得分:3)
您拥有的是可变长度数组。此类阵列只能具有自动存储持续时间。换句话说,它们是在大多数实现中驻留在堆栈上的局部变量。
此类数组的定义在C standard的第6.7.6.2节第4节中定义:
如果大小不存在,则数组类型为不完整类型。如果 大小是*而不是表达式,数组类型是a 可变长度数组类型的未指定大小,只能使用 在具有函数原型范围的声明或类型名称中;这样 尽管如此,数组仍然是完整类型。如果大小是整数 常量表达式和元素类型具有已知的常量大小, 数组类型不是可变长度数组类型;否则, 数组类型是可变长度数组类型。
假设len
不足以超越筹码,你应该没事,否则你最好动态分配。