C中空数组的本质是什么?

What is the nature of an empty array in C?

我有以下代码:

#include <stdio.h>

int main(void) {
    int array[0];
    printf("%d", array);
    return 0;
}

正如我们所知,一个数组总是指向它的第一项,但在这个例子中我们没有项目,但是这段代码产生了一些内存地址。它指向什么?

大小为 0 的数组被视为违反约束。因此,拥有这样一个数组并尝试使用它会触发 undefined behavior.

关于数组声明符约束的 C standard 第 6.7.6.2p1 节指出:

In addition to optional type qualifiers and the keyword static, the [ and ] may delimit an expression or *. If they delimit an expression (which specifies the size of an array), the expression shall have an integer type. If the expression is a constant expression, it shall have a value greater than zero. The element type shall not be an incomplete or function type. The optional type qualifiers and the keyword static shall appear only in a declaration of a function parameter with an array type, and then only in the outermost array type derivation

GCC 将允许零长度数组作为扩展,但前提是它是 struct 的最后一个成员。这是指定 灵活数组成员 的替代方法,如果省略数组大小,则 C 标准中允许这种方法。