关于一维数组转二维数组及二维数组越界访问输出地址值的疑问咨询
为什么你的二维数组代码输出了这些奇怪的数字?
我来帮你一步步拆解这个问题~
1. 输出值的来源是什么?
你代码里的a[d]并不是你以为的“二维数组的第d个元素”——在C语言中,二维数组a[3][3]本质上是一个“数组的数组”。当你写a[d]时,它代表的是二维数组中第d行的起始地址(也就是指向该行第一个元素的指针)。
而你用printf("%d", a[d])的时候,其实是把这个指针的内存地址以十进制整数的形式打印出来了。那些看起来莫名其妙的数字(比如6422048),就是这些行指针在内存中的实际地址值。
2. 为什么输出值的增量为12?
这个和你的数组类型、内存布局直接相关:
- 你的数组是
int类型,在绝大多数现代系统中,一个int会占用4字节的内存空间。 - 你的二维数组每行包含3个
int元素,所以一行的总字节数是3 * 4 = 12字节。 - 在C语言中,二维数组的内存是连续存储的——第一行的3个元素存完,紧接着就是第二行的3个元素,以此类推。
因此每一行的起始地址,都会比上一行的起始地址大12字节,这就是你看到输出值每次增加12的原因。
3. 额外需要注意的问题
你的循环条件是d < 5,但你的二维数组只有3行(索引为0、1、2)。当d=3和d=4时,a[d]已经属于数组越界访问——你在访问数组之外的内存地址。虽然这次程序没崩溃,但这种行为是C语言里的“未定义行为”,可能在其他场景下导致程序崩溃或出现奇怪的错误,一定要避免哦!
如果你的目标是正确遍历二维数组元素,或者把一维数组的数据导入二维数组,应该使用嵌套循环,比如:
#include <stdio.h> int main() { int a[3][3] = {{2, 4, 5}, {6, 7, 8}, {9, 10, 11}}; // 遍历二维数组的每个元素 for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { printf("a[%d][%d] = %d\n", i, j, a[i][j]); } } return 0; }
内容的提问来源于stack exchange,提问作者BlueishCargo
相关产品推荐
相关产品推荐

