【问题标题】:unspecified dimension of array initialisation with {}使用 {} 进行数组初始化的未指定维度
【发布时间】:2012-01-07 10:46:03
【问题描述】:

我想知道是否:

int a[] = {1, 2};

分配 sizeof(int) * 括号内的常量数

int a[5] = {1, 2};

将常量分配给从 0 到 1 的数组字段,然后用 0 填充

int a[5] = {};

用 0 填充

当我这样做时会发生什么:

int a[] = {};

谢谢。

【问题讨论】:

  • 它是否分配任何内存或只是制作常量指针?该指针指向哪里(数组常量指针是指向自身的指针)?所以它分配了 1 个 int?

标签: c arrays initialization


【解决方案1】:
int a[5] = {};

 int a[] = {};

不是有效的 C 定义。

在 GNU C(带有 gcc 扩展的 C)中,您可以使用空的 {},它被认为与 {0} 相同。

请注意,int [] 是一个不完整的类型。当使用显式初始化器初始化一个不完整类型的数组时,类型是完整的,数组的元素数就是大括号括起来的初始化器列表中的元素数。

所以int a[] = {0}; 在 C 中定义了一个包含 1 个元素的数组,而在 GNU C 中 int a[] = {}; 也是如此。

【讨论】:

  • a[5] = {0} 和 a[5] = {} 有什么区别?在第一个中,您有 1 个常数,其余部分用零填充,在另一个中,您有零个常数,其余部分用零填充。根据什么规则是无效的?我正在查看 K&R 和 C ISO,但找不到。
  • @Deximat,它是无效的,因为标准不允许空初始化器,就这么简单。
  • 感谢您的快速解答!
猜你喜欢
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-04
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多