C语言函数参数数组声明中const、volatile、static的含义是什么?
C语言函数数组形参中const/volatile/static关键字的含义
你给出的void f(int a[const volatile static 2])是C99标准引入的特殊语法,首先明确C语言的基础规则:函数形参声明的数组类型会自动调整为指向首元素的指针,所以普通的int a[2]形参本质和int *a完全等价,方括号里的数字在普通场景下没有强制约束作用。
C99扩展允许在数组形参的方括号内添加限定符和static关键字,各部分作用拆解如下:
static 2
放在方括号最前的static是编译器约定,要求调用该函数时,传入的实参必须是指向至少包含2个int元素的有效内存的非空指针。编译器可以基于这个前提做代码优化,若能检测到实参长度不足(比如你的示例中传入了长度为1的数组b),会给出编译警告。注意该约定不会触发强制运行时检查,若传入不符合要求的参数会触发未定义行为。const
此处的const修饰的是调整后的指针本身,等价于int *const a,表示在函数内部不能修改a的指向(不允许a++、a = 其他指针这类操作),和指针指向的元素是否可修改无关。如果要限制元素修改,需要将const放在类型前,即const int a[static 2],等价于const int *a。volatile
和const同理,修饰的是指针本身,等价于int *const volatile a,表示对a这个指针的访问需要遵循volatile语义,每次读取都必须从内存真实加载,不能做寄存器缓存、指令重排这类优化。
你给出的示例代码能编译通过是因为违反static长度约定不属于语法错误,仅属于违反编程约定的行为,大部分编译器在没有开启对应告警选项的情况下不会阻止编译,但运行会触发未定义行为。
内容的提问来源于stack exchange,提问作者Kevin Meier
相关产品推荐
相关产品推荐

