如here,here和here以这种方式定义的函数(在c99 或更新版本中)
void func(int ptr[static 1]){
//do something with ptr, knowing that ptr != NULL
}
Run Code Online (Sandbox Code Playgroud)
有一个ptr指向 int 类型指针的参数 ( ) 并且编译器可以假定该函数永远不会以 null 作为参数被调用。(例如,编译器可以优化空指针检查,或者在使用空指针调用 func 时发出警告 - 是的,我知道,编译器不需要执行任何操作......)
C17 第6.7.6.3节函数声明符(包括原型)第 7 段说:
将参数声明为“类型数组”应调整为“指向类型的限定指针”,其中类型限定符(如果有)是在数组类型派生的 [ 和 ] 中指定的那些。如果关键字static也出现在数组类型派生的 [ 和 ] 中,那么对于函数的每次调用,相应实参的值应提供对数组的第一个元素的访问,该元素至少与指定的元素一样多由大小表达式。
在上述定义的情况下,值ptr必须提供对至少具有元素的数组的第一个元素的访问1。因此很明显,该参数永远不能为空。
我在徘徊的是,使用不属于数组的 int 的地址调用这样的函数是否有效。例如,这是(根据func上面的定义)技术上有效还是未定义的行为:
int var = 5;
func(&var);
Run Code Online (Sandbox Code Playgroud)
我知道这实际上永远不会成为问题,因为我所知道的编译器没有区分指向 int 数组成员的指针和指向局部 int …