gpt4 book ai didi

指向不完整类型的指针可以不完整吗?

转载 作者:行者123 更新时间:2023-12-04 09:06:28 32 4
gpt4 key购买 nike

可以 int (*)[]是不完整的类型?

C 2018 6.2.5 1 说:

At various points within a translation unit an object type may be incomplete (lacking sufficient information to determine the size of objects of that type) or complete (having sufficient information).



因此,似乎如果类型的大小已知,则该类型是完整的。 6.2.6.1 28 指定某些类型的指针必须具有相同的大小(指向 void 和字符的指针、指向兼容类型的指针、指向结构的指针和指向 union 的指针),但指向其他类型的指针可能会有所不同。

在 C 实现中,所有指针,或所有指向 int 数组的指针, 大小相同,则 int (*)[] 的大小是已知的,所以它会是完整的。在一个实现中,比如说,对大数组使用不同的指针,大小是未知的,所以它是不完整的。

M.M points out ,结构不得包含不完整类型的成员,除了最终的灵活数组成员,根据 6.7.2.1 3 中的约束。这表明具有一个指针大小的实现必须接受 struct { int (*p)[]; }而对于此类数组具有不同大小的实现必须诊断约束违规。 (这反过来意味着这样的声明不是严格遵守 C 的一部分。)

最佳答案

未知大小的数组是不完整的:

An array type of unknown size is an incomplete type. It is completed, for an identifier of that type, by specifying the size in a later declaration (with internal or external linkage).



型号 int (*)[]然而并非不完整:它是 int 数组的指针大小未知。
指针具有众所周知的大小:
printf ("Size %d\n", sizeof(int (*)[]));

6.2.5/23: A type has known constant size if the type is not incomplete and is not a variable length array type.



此外,由于数组语义,您甚至可以取消引用它:
typedef int (*T)[];
...
int a[10];
for (int i=0; i<10; i++) a[i]=i;
T p=a;
for (int i=0; i<10; i++) printf ("%d ",(*p)[i]);
printf ("\n");

编辑

此外,指针始终是完整类型。它在 6.2.5/20 中写成黑底白字:

A pointer type may be derived from a function type or an object type, called the referenced type. A pointer type describes an object whose value provides a reference to an entity of the referenced type. A pointer type derived from the referenced type T is sometimes called ‘‘pointer to T’’. The construction of a pointer type from a referenced type is called ‘‘pointer type derivation’’. A pointer type is a complete object type.

关于指向不完整类型的指针可以不完整吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59724711/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com