c、 运行时缓冲区大小(按函数参数)
我正在写一个函数,需要测试一些外部SPI闪存。 在开发过程中,我偶然使用了此代码c、 运行时缓冲区大小(按函数参数),c,variable-length-array,C,Variable Length Array,我正在写一个函数,需要测试一些外部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); ...
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]
编译器如何可能知道@runtime的len是什么来调整缓冲区的大小?
注释后的代码似乎更符合逻辑(malloc)
现在的问题是,如果代码有效,我宁愿不使用malloc(嵌入式原因)。或者只是偶然运行,堆栈在该区域是空闲的
感谢您的澄清(我使用gnu c99)。您拥有的是一个可变长度数组。此类阵列只能具有自动存储持续时间。换句话说,在大多数实现中,它们是驻留在堆栈上的局部变量 此类阵列的定义见本规范第6.7.6.2 p4节: 如果大小不存在,则数组类型为不完整类型。如果 大小为*而不是表达式,数组类型为 未指定大小的可变长度数组类型,只能使用 具有函数原型作用域的声明或类型名称中;这样的 尽管如此,数组仍然是完整的类型。如果大小是整数 常量表达式,并且元素类型具有已知的常量大小, 数组类型不是可变长度数组类型;否则 数组类型是可变长度数组类型
假设
len
的大小不足以溢出堆栈,那么就可以了,否则最好使用动态分配。您使用的是c99
中引入的可变大小数组。但是请记住,wbuff
和rbuff
是在堆栈上创建的,这与您注释的代码示例不同。Hmmm。。。太好了:)那么现在问题来了。。让它们堆起来或堆起来!谢谢。请注意,VLA是在C99中引入的,C11将其设置为可选的,因此如果您想要长期稳定性和切换编译器的能力,它们可能并不总是最佳选择。