GCC手册解析——变长数组
Posted 从善若水
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GCC手册解析——变长数组相关的知识,希望对你有一定的参考价值。
本人就职于国际知名终端厂商,负责modem芯片研发。
在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。
GCC手册解析——变长数组
历史
可变数组是在ISO C99中引入的,GCC对其进行扩展在C90中也可以使用
变长数组的声明以及内存管理
可变数组的声明与常规数组声明一样,只不过将常量(constant expression)变成了一个变量。
......
char const_length_array[10]; //常规数组声明
int variable_length=10;
char variable_length_array[variable_length]; //变长数组声明
......
变长数组的内存是在变长数组声明时进行分配的,当超出作用范围(程序顺序执行、goto 或者 break等操作)时就自动回收内存
一个特殊情况就是,goto不能跳进有变长数组的code block,否则程序编译失败<详情可以参考我的这篇博文>
GCC还对其进行了扩展,在structure和union中可以定义变长数组作为数据成员
void
foo (int n)
{
struct S { int x[n]; };
}
也可以使用变长数组作为函数入参
/* case 1 */
void
tester (int len, char data[len][len])
{
/* … */
}
前置声明
/* case 2 */
void
tester (int len; char data[len][len], int len)
{
/* … */
}
上面的case 2也是GCC的一个扩展(ISO C99不支持此功能),如果你希望先传递数组再传递数组长度,那么可以使用case2的方法
分号前的‘int len’就是一个前置声明,主要目的是解析data声明时可以知道len的数据类型
前置声明没有数量限制,多个前置声明可以使用逗号或者分号分隔,但是最后一个前置声明必须以冒号(semicolon)结束,且紧邻一个真实的参数声明。
每一个前置声明都必须与一个真实的参数名称以及类型完全匹配
以上是关于GCC手册解析——变长数组的主要内容,如果未能解决你的问题,请参考以下文章