【问题标题】:C: Allowed to assign any array to pointer to array of incomplete typeC:允许将任何数组分配给指向不完整类型数组的指针
【发布时间】:2014-06-22 14:37:28
【问题描述】:

以下内容在 C89 中的合法性似乎存在问题。我不明白为什么它是允许的。我正在阅读标准和我的 K&R2 副本,但我仍然不明白。

char Arr[16];
char (*Durr)[] = &Arr; /*Why is this allowed?*/

真的是这样。我需要 C89 标准的引用,告诉我为什么允许这样做。这不是 C++ 问题,那里绝对是非法的。谢谢!

编辑:这解释了标准中的问题:http://port70.net/~nsz/c/c89/c89-draft.html#3.3.16.1

【问题讨论】:

  • 您在哪里看到不完整的类型?我错过了什么吗?
  • 是的。该指针是一个指向未知大小数组的指针,这使它成为一个不完整类型的指针。
  • 首先,Arr 确实有一个已知大小:16 * sizeof(char)。其次,据我了解,获取地址并分配指针不是问题。只有取消引用指向不完整类型的指针才是问题。不过,我对这里的一些 C 规范专家不得不说的话很感兴趣。
  • 在我看来,这与int a; int *p = &a; 没有什么不同。
  • 这将解释混乱的来源:port70.net/~nsz/c/c89/c89-draft.html#3.3.16.1

标签: c arrays ansi language-lawyer incomplete-type


【解决方案1】:

char (*Durr)[] = &Arr;中的初始化需要Durr指向一个与Arr的类型兼容的数组。

根据“6.7.6.2 数组声明符”(n1570)

6 对于要兼容的两种数组类型,两者都应具有兼容的元素类型,如果 两个大小说明符都存在,并且是整数常量表达式,那么两个大小 说明符应具有相同的常数值。

因为Durr指向的数组有一个不完整的类型,这意味着这两种类型应该是兼容的,那么编译器不应该为这个初始化给出错误/警告。

【讨论】:

  • 我相信这将是与 C89 中的 3.5.4.2 相同的文本。我只有一些 C89 的古老草稿,所以我不确定。 C89 已经过时了……
  • @Lee:谢谢。这正是我所希望的那种报价。这是一个非常称职的答案。也许你也可以给我这个标准文本?这个问题有一个赏金。 stackoverflow.com/questions/20951091/…
  • @Subsentient C99 和 C11 修复了 C 语言中的许多重大缺陷和精神错乱。仅出于这个原因,C89 就已经过时了。是否选择使用 C99/C11 的全新功能是另一回事。
  • Because the array pointed to by Durr has an incompleted type!不是Arr16的大小吗?
  • @ajay 你错过了“如果两个尺寸说明符都存在”。
猜你喜欢
  • 2015-10-09
  • 2021-12-31
  • 2012-08-15
  • 2017-02-12
  • 1970-01-01
  • 1970-01-01
  • 2017-10-19
  • 1970-01-01
相关资源
最近更新 更多