c,函数参数的运行时缓冲区大小

时间:2018-06-18 20:19:30

标签: 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);
...

请注意' len'是争论。 现在代码按预期工作(我测试了一些参数),但我的问题是正确的吗?

我的意思是

uint8_t wbuff[len]

编译器怎么可能知道len是@runtime来调整缓冲区的大小? 评论的代码似乎更符合逻辑(malloc)。

现在问题是代码是否有效,我更喜欢不使用malloc(嵌入式原因)。或者只是偶然运行该区域的堆栈是免费的。

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

1 个答案:

答案 0 :(得分:3)

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

此类数组的定义在C standard的第6.7.6.2节第4节中定义:

  

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

假设len不足以超越筹码,你应该没事,否则你最好动态分配。