gpt4 book ai didi

c++ - 指向未知大小数组的指针是否不完整?

转载 作者:太空狗 更新时间:2023-10-29 20:24:50 25 4
gpt4 key购买 nike

3.9/6 N3797:

[...]

The type of a pointer to array of unknown size, or of a type defined by a typedef declaration to be an array of unknown size, cannot be completed.

这听起来像是指向未知大小数组的指针是不完整的类型。如果是这样,我们就不能定义一个指向未知大小数组的指针的对象。但事实并非如此,因为我们可以定义一个未知边界的数组。

#include <iostream>

using std::cout;
using std::endl;

int (*a)[] = (int(*)[])0x4243afff;

int main()
{

}

它编译得很好。

DEMO

如果它是不完整的类型,我们就无法做到。的确:3.9/5:

Objects shall not be defined to have an incomplete type

标准之前定义了一个不完整的类型,如下 3./5:

A class that has been declared but not defined, an enumeration type in certain contexts (7.2), or an array of unknown size or of incomplete element type, is an incompletely-defined object type. Incompletely defined object types and the void types are incomplete types (3.9.1).

这意味着指向不完整类型的指针是完整的。自相矛盾?

那么我的推理哪里错了?

最佳答案

我认为这个措辞是有缺陷的。在您的代码中:

 int (*a)[];

a 的类型实际上是完整的。 *a 的类型不完整。在我看来(正如 dyp 在评论中所说),引述的意图是说在程序的后面,*a 不可能是一个具有完整类型的表达式。

背景:一些不完整的类型可以稍后完成,例如正如 cdhowie 和 dyp 所建议的:

extern int a[];
int b = sizeof a; // error
int a[10];
int c = sizeof a; // OK

但是 int (*a)[]; 后面无法完成; sizeof *a 永远是一个错误。

关于c++ - 指向未知大小数组的指针是否不完整?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25967060/

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