`void foo(int a[static 0]);`是否符合C99标准及合法调用场景问询
int a[static 0]函数参数的C99合规性及调用合法性 一、函数是否符合C99标准?
完全符合。
C99标准6.7.6.3第7款明确规定:函数参数里的数组类型声明带static限定符时,要求对应的实参指针必须指向至少指定数量的元素。当指定数量为0时,这个条件等价于实参是一个有确定值的指针——任何有效指针(哪怕是指向数组末尾的“空悬”指针,只要不解引用)都天然满足“指向至少0个元素”的要求。
GCC和Clang发出的警告属于编译器的额外提示,并非因为代码违反C99标准。编译器可能是担心开发者误用零大小数组语法,但从标准层面看,void foo(int a[static 0])的写法是合规的。
二、三个调用场景的合法性分析
foo(NULL):非法。NULL是空指针常量,不属于“有确定值的指向对象的指针”,违反了static 0对实参的要求,属于未定义行为。foo(&i):合法。&i是指向有效int对象的指针,完全满足“指向至少0个元素”的条件,符合标准规定。foo(&i + 1):合法。&i + 1是指向i之后第一个内存位置的指针(即标准允许的“数组末尾哨兵指针”),它是有确定值的指针,满足static 0的要求(注意:该指针不能解引用,但这里函数内仅做了(void)a的无意义处理,无问题)。
内容的提问来源于stack exchange,提问作者tstanisl
相关产品推荐
相关产品推荐

