首页 > 解决方案 > 为什么我可以使用二维数组从 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

标签: cpointersmemorymultidimensional-array

解决方案


pArr是一个由 3 个指向 int 的指针组成的数组。

当在表达式中使用时,pArr将转换为指向 int 的指针并指向数组的初始元素(即指向 int 的指针)。

所以当你这样做时:

int* pArr1d = (int*)pArr;

您将“指向 int 的指针”转换为“指向 int 的指针”。类型不兼容。一旦取消引用强制转换的指针,它就是未定义的行为。

当你打印它时,你会犯两个违规行为,这也是未定义的行为。

  1. 您打印指针就像它们是整数一样。

  2. 您越界访问数组。


推荐阅读