c - 为什么我可以使用二维数组从 int** 转换为 int*,但不能使用指针数组?
问题描述
为什么我可以使用二维数组从 int** 转换为 int*,但不能使用指针数组?
所以例如为什么当我这样做时:
int arr2d[3][3] = { { 1, 2, 3}, { 4, 5, 6}, { 7, 8, 9} };
int* arr = (int*)arr2d;
int i = 0;
for (i = 0; i < 9; i++)
{
printf("%d ", arr[i]);
}
它可以工作并打印:1 2 3 4 5 6 7 8 9
但是当我这样做时:
int arr1[] = { 11, 12 };
int arr2[] = { 13, 14, 15, 16 };
int arr3[] = { 17, 18, 19 };
int* pArr[3] = { arr1, arr2, arr3 };
int* pArr1d = (int*)pArr;
for (i = 0; i < 9; i++)
{
printf("%d ", pArr1d[i]);
}
它不起作用并打印:4192000 4191976 4191956 -858993460 -858993460 17 18 19 -858993460
解决方案
pArr
是一个由 3 个指向 int 的指针组成的数组。
当在表达式中使用时,pArr
将转换为指向 int 的指针并指向数组的初始元素(即指向 int 的指针)。
所以当你这样做时:
int* pArr1d = (int*)pArr;
您将“指向 int 的指针”转换为“指向 int 的指针”。类型不兼容。一旦取消引用强制转换的指针,它就是未定义的行为。
当你打印它时,你会犯两个违规行为,这也是未定义的行为。
您打印指针就像它们是整数一样。
您越界访问数组。