C和C ++之间不完整数组指针转换规则的差异

时间:2015-11-18 14:22:53

标签: c++ c arrays pointers g++

当我使用gccg++编译以下代码时,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中出错?

2 个答案:

答案 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 ++中,数组类型包括维度。总是

(晴)