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