c、 运行时缓冲区大小(按函数参数)

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); ...

我正在写一个函数,需要测试一些外部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]
编译器如何可能知道@runtime的len是什么来调整缓冲区的大小? 注释后的代码似乎更符合逻辑(malloc)

现在的问题是,如果代码有效,我宁愿不使用malloc(嵌入式原因)。或者只是偶然运行,堆栈在该区域是空闲的


感谢您的澄清(我使用gnu c99)。

您拥有的是一个可变长度数组。此类阵列只能具有自动存储持续时间。换句话说,在大多数实现中,它们是驻留在堆栈上的局部变量

此类阵列的定义见本规范第6.7.6.2 p4节:

如果大小不存在,则数组类型为不完整类型。如果 大小为*而不是表达式,数组类型为 未指定大小的可变长度数组类型,只能使用 具有函数原型作用域的声明或类型名称中;这样的 尽管如此,数组仍然是完整的类型。如果大小是整数 常量表达式,并且元素类型具有已知的常量大小, 数组类型不是可变长度数组类型;否则 数组类型是可变长度数组类型


假设
len
的大小不足以溢出堆栈,那么就可以了,否则最好使用动态分配。

您使用的是
c99
中引入的可变大小数组。但是请记住,
wbuff
rbuff
是在堆栈上创建的,这与您注释的代码示例不同。Hmmm。。。太好了:)那么现在问题来了。。让它们堆起来或堆起来!谢谢。请注意,VLA是在C99中引入的,C11将其设置为可选的,因此如果您想要长期稳定性和切换编译器的能力,它们可能并不总是最佳选择。