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 标准中允许这种方法。
我有以下代码:
#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 keywordstatic
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 标准中允许这种方法。