将二维数组强制转换为一维数组是否符合标准且可移植?
从C标准角度看二维数组转一维指针的合法性
你的代码里把int[ROW][COL]类型的数组通过(int*)arr转换为int*,再传给接受一维数组参数的函数,从C标准角度是合法且符合规范的,原因如下:
多维数组的内存布局:C标准明确规定,多维数组的元素在内存中是连续存储的。比如
int arr[ROW][COL],会按行优先的顺序把所有ROW*COL个int元素连续排列,整个数组的内存块和同大小的一维int[ROW*COL]数组完全一致。指针转换的合法性:数组名
arr在表达式中会隐式转换为指向其首元素的指针(类型是int (*)[COL],即指向长度为COL的int数组的指针)。根据C标准,指向对象的指针可以转换为其他对象类型的指针,只要转换后的指针指向的地址是目标类型对齐的。这里二维数组的起始地址和第一个int元素的地址完全重合,int类型的对齐要求肯定满足,所以(int*)arr这个转换是允许的。元素访问的合法性:通过转换后的
int*遍历所有ROW*COL个元素,既符合严格别名规则(都是int类型,不存在跨类型访问的问题),也没有超出数组的内存范围——整个二维数组的内存大小就是ROW*COL*sizeof(int),从起始地址开始连续访问这些位置,完全在标准允许的范围内。
另外要注意,函数参数里的int arr[ROW * COL]会被编译器自动调整为int* arr,所以test函数里的arr[i]本质就是通过int指针访问元素,和转换后的指针用法完全匹配。
内容的提问来源于stack exchange,提问作者gberth
相关产品推荐
相关产品推荐

