【问题标题】:c, runtime buffer size by function argumentc,函数参数的运行时缓冲区大小
【发布时间】:2018-11-27 17:42:47
【问题描述】:

我正在编写一个需要测试一些外部 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)。

【问题讨论】:

  • 您正在使用c99 中引入的可变大小数组。但请记住,与您注释的代码示例不同,wbuffrbuff 是在堆栈上创建的。
  • 嗯...太棒了:)所以现在的问题..让它们放在堆栈或堆上!谢谢。

标签: c variable-length-array


【解决方案1】:

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

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

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

假设 len 不会大到足以超出堆栈,你应该没问题,否则你最好使用动态分配。

【讨论】:

  • 请注意,VLA 是在 C99 中引入的,在 C11 中是可选的,因此如果您想要长期稳定性和切换编译器的能力,它们可能并不总是最佳选择。
猜你喜欢
  • 2013-06-14
  • 1970-01-01
  • 2018-11-10
  • 1970-01-01
  • 2011-11-26
  • 2017-04-07
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
相关资源
最近更新 更多