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手册解析——变长数组的主要内容,如果未能解决你的问题,请参考以下文章

C语言面试干货——指定数组初始化器(GCC手册解析)

C语言面试干货——指定数组初始化器(GCC手册解析)

GCC 如何实现变长数组?

GCC手册解析——内嵌函数(非闭包函数)

GCC手册解析——内嵌函数(非闭包函数)

变长数组的原型