C和C ++之间不完整数组指针转换规则的差异
当我用gcc
和g++
编译下面的代码时, g++
给出错误而不是gcc
。 请注意,代码从int (*)[4]
为int (*)[]
(指向不完整数组类型的指针)。
int arr[4]; int (*p_arr)[] = &arr;
如不完整数组类型中所述? , C
语言允许这种转换。 但是为什么C++
不允许这样做并给出错误error: cannot convert 'int (*)[4]' to 'int (*)[]' in assignment
。 我知道C ++比C更安全类型,但是这个赋值实际上是类型不安全的,因为后来指针的引用(例如sizeof(*p_arr)
)无论如何都会在C
出错?
转换本身是安全的,但请记住,C中允许此转换的相同规则也允许它在相反的方向上。
int main() { int array[4] = {0}; int (*ptr4)[4] = &array; int (*ptrN)[] = ptr4; int (*ptr5)[5] = ptrN; /* oh dear */ }
这显然很糟糕。 C ++已经删除了这个规则,说int[4]
和int[]
是兼容的类型,并且几乎摆脱了兼容类型的概念。
一些安全的特定转换正在考虑包含在未来的C ++版本中 。 它们也包括您的转换。
是的,这项任务确实是类型不安全的。
在C ++中,数组类型包括维度。 总是。
(大多。)