【问题标题】:What is the nature of an empty array in C?C中空数组的本质是什么?
【发布时间】:2021-07-25 06:11:42
【问题描述】:

我有以下代码:

#include <stdio.h>

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

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

【问题讨论】:

  • MSVC 不会编译空数组。
  • 您应该将问题标记为@dbush 已回答
  • 你读过像n1570这样的最新C标准吗?
  • @Tarik IIRC 您必须在发布问题后等待 15 分钟才能接受(尽管我可能记错了)。不过答案很好!

标签: arrays c pointers memory size


【解决方案1】:

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

C standard 第 6.7.6.2p1 节关于数组声明器状态的约束:

除了可选的类型限定符和关键字static[] 可以分隔表达式或*。如果它们分隔了一个表达式(它指定了一个数组的大小),则该表达式应为整数类型。 如果表达式为常量表达式,则其值应大于零。 元素类型不得为不完整或函数类型。可选类型限定符和关键字static 只能出现在具有数组类型的函数参数的声明中,并且只能出现在最外层的数组类型派生中

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

【讨论】:

  • 可能离题但是“或*”是什么意思?我从未见过定义为 int foo[*]; 的数组
  • @mediocrevegetable1 用在函数声明中,其中数组大小是较早的参数并且没有给出成员名称,即void func(int x, int y, int arr[x][y])可以声明为void func(int, int, int [*][*])
  • @dbush: * 不必代表较早的参数。它只是在函数声明中指示数组是可变长度数组。在函数定义中,可以使用通用表达式,包括使用前面的参数、外部标识符、函数调用等。
猜你喜欢
  • 1970-01-01
  • 2015-02-10
  • 2012-08-19
  • 1970-01-01
  • 2017-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
相关资源
最近更新 更多