use*_*104 5 c c++ arrays pointers g++
当我使用gcc和编译以下代码时g++,g++给出错误而不是gcc.请注意,代码将转换int (*)[4]为int (*)[](指向不完整数组类型的指针).
int arr[4];
int (*p_arr)[] = &arr;
Run Code Online (Sandbox Code Playgroud)
如不完整数组类型中所述?,C语言允许这种转换.但为什么C++不允许这样做并给出错误error: cannot convert ‘int (*)[4]’ to ‘int (*)[]’ in assignment.我知道C++比C更安全类型,但是这个赋值实际上是类型不安全的,因为指针的后来引用(例如sizeof(*p_arr))无论如何都会产生错误C吗?
小智 1
转换本身是安全的,但请记住,C 中允许这种转换的相同规则也允许相反的方向。
int main() {
int array[4] = {0};
int (*ptr4)[4] = &array;
int (*ptrN)[] = ptr4;
int (*ptr5)[5] = ptrN; /* oh dear */
}
Run Code Online (Sandbox Code Playgroud)
这显然很糟糕。int[4]C++ 已经删除了这条规则,即和是兼容类型的规则int[],并且几乎摆脱了兼容类型的概念。
正在考虑将一些安全的特定转换包含在 C++ 的未来版本中。它们也包括您的转化。