C语言数组边界排列规则及二维数组索引正确性问询
C二维数组结构与索引问题解答
数组结构说明
对于定义int arr[4][5];,它等价于包含4个元素的一维数组,每个元素又是一个包含5个int类型元素的一维数组——简单说就是逻辑上的4行5列数组,绝非“包含5个4元素数组”的结构。
你可以通过sizeof操作直接验证:
sizeof(arr):整个数组的总大小,等于4 * 5 * sizeof(int)sizeof(arr[0]):数组第一个元素的大小,也就是单个5元素int数组的大小,等于5 * sizeof(int)sizeof(arr[0][0]):单个int元素的大小,即sizeof(int)
通过计算sizeof(arr)/sizeof(arr[0])得到4,sizeof(arr[0])/sizeof(arr[0][0])得到5,就能明确外层数组有4个元素,每个内层数组包含5个元素。
数组索引规则
C语言的数组索引是从0开始计数的:
- 第一个维度(外层数组)的合法索引范围是
0到3(总共有4个元素) - 第二个维度(内层数组)的合法索引范围是
0到4(每个内层数组有5个元素)
所以:
arr[4][3]属于越界访问,第一个维度的索引4超出了0-3的合法范围arr[3][4]才是访问最后一个元素的正确写法,对应逻辑上的第4行第5列元素(从1开始计数的表述)
验证方法(规避越界风险)
你可以通过初始化数组并打印元素的方式验证,示例代码:
#include <stdio.h> int main() { int arr[4][5]; // 给最后一个合法元素赋值 arr[3][4] = 100; // 打印该元素,会输出100 printf("arr[3][4] = %d\n", arr[3][4]); // 遍历所有合法元素,确认范围 for(int i=0; i<4; i++){ for(int j=0; j<5; j++){ arr[i][j] = i*10 + j; printf("%d ", arr[i][j]); } printf("\n"); } return 0; }
运行后会输出4行、每行5个连续数值,最后一行最后一个数是34,对应arr[3][4],直观验证索引规则。
内容的提问来源于stack exchange,提问作者Apoqlite
相关产品推荐
相关产品推荐

