You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将二维数组强制转换为一维数组是否符合标准且可移植?

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 08:42:24