以下功能是否严格符合C99?

void foo(int a[static 0]) {
  (void)a;
}

GCC和Clang都发出了使用零大小数组的警告,但我认为这个警告是没有道理的.AFAIK中,6.7.6.3p7告诉static关键字指示指针a应该指向至少零个元素,这一要求对于任何具有确定值的指针来说都是微不足道的.

此外,在以下情况下是否可以调用此类函数:

int i;
foo(NULL);
foo(&i);
foo(&i + 1);

推荐答案

AFAIK,6.7.6.3p7告诉static关键字指示指针a应该指向至少零个元素…

6.7.6.3 7不是唯一适用的规则.

如您所知,声明为数组的参数会自动调整为指针.但在调整它之前,它是一个声明为数组的参数.数组声明符的规则之一是6.7.6.2 1中的约束:

除了可选的类型限定符和关键字Static之外,[]还可以分隔表达式或*.如果它们分隔一个表达式(指定数组的大小),则该表达式应为整数类型.如果表达式是常量表达式,则其值应大于零…

即使满足6.7.6.3 7,违反6.7.6.2 1也是违反约束.

…指向至少零个元素,任何具有确定值的指针都可以很容易地满足这一要求.

不,不是的.首先,空指针不指向至少零个元素,因为它不指向任何元素.

其次,指针不仅需要指向至少零个元素,还需要特别指向至少包含零个元素的数组的第一个元素.任何至少有零个元素的数组都至少有一个元素,因为6.2.5 20将数组类型定义为"连续分配nonempty组具有特定成员对象类型的对象".因此,它是一个数组这一事实本身就意味着它至少有一个元素.

因此,即使声明为int a[static 0],a也必须至少指向一个int.

C++相关问答推荐

C语言中字符数组声明中的标准

为什么双重打印与C中的float具有不同的大小时具有相同的值?

在C中将通用字符名称转换为UTF-8

在C++中头文件中声明外部 struct

如何在ASM中访问C struct 成员

&;(str[i])和(&;str)[i]有什么区别?

如何在C中只对字符串(包含数字、单词等)中的数字进行重复操作?

C I/O:在Windows控制台上处理键盘输入

添加函数会 destruct 嵌入式C代码(无IDE)

C整型和_泛型.哪些类型是兼容的?

试图创建一个基本的Word克隆,但遇到了障碍

不使用任何预定义的C函数进行逐位运算

C-try 将整数和 struct 数组存储到二进制文件中

为什么会出现此错误?二进制表达式的操作数无效

传递给函数的 struct 中的数组

在C中交换字符串和数组的通用交换函数

当另一个指向 const 的指针观察到数据时,通过指针更改数据是否安全?

如何修复数组数据与列标题未对齐的问题?

使用邻接表创建图

malloc:损坏的顶部大小无法找出问题