C是否指定静态多维数组的内存格式?

问题描述

根据我的经验,二维C阵列通常在内存中变平。所有编译器和平台都适用吗?是否在各个平台/编译器上将N维数组强制转换为int*并以arr_ptr[j + i*width]的身份进行访问?


更多细节如下。据我了解,像

这样的变量
int data[2][3];

将在堆栈/数据段中显示

  lower addresses <----------------------------------------> higher addresses
| data[0][0] | data[0][1] | data[0][2] | data[1][0] | data[1][1] | data[1][2] |

对于采用这种类型的函数,我们可能要避免使用像这样的调用签名

void handle2dArray(int arr[][10]);

很显然有避免这种情况的方法

  • 改为分配一个int **
  • 使用一维数组并使用arr[j + i*width]
  • 进行访问

但是假设由于某些原因,我们需要使用int[][SIZE]。通过将其转换为int *来处理此2D数组是否安全,如下所示?

void print2D(int *ptr,size_t dim0,size_t dim1) {
    printf("2D Array: (%zu x %zu)\n",dim0,dim1);
    for (size_t i = 0; i < dim0; i++) {
        for (size_t j = 0; j < dim1; j++) {
            printf("%d ",ptr[i*dim1 + j]);
        }
        printf("\n");
    }
}

int main() {
    int array2D[10][10];
    print2D((int*)array2D,10,10);
}

在我的实验中,这在具有相当标准体系结构的几台不同计算机上似乎适用于合理的尺寸,尺寸数和编译器(gcc,clang,vc)。对C维规范所保证的对N维数组的这种处理是否被认为是处理这些情况的“适当”方法

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)