我试图理解 C 处理数组的方式,在这种情况下,通过读取二维数组,就好像它是一维数组一样。
给定这个简单的 C 程序
#include <stdio.h>
int main(int argc, char *argv[]){
int array[4][4];
int i, j;
for(i = 0; i < 4; i++){
for(j = 0; j < 4; j++){
array[i][j] = (i+1)*(j+1);
printf("%d ", array[i][j]);
}
printf("\n");
}
for(i = 0; i < 16; i++){
printf("%d ", array[i]);
}
printf("\n");
}
我得到了这个奇怪的输出。
1 2 3 4
2 4 6 8
3 6 9 12
4 8 12 16
56319776 56319792 56319808 56319824 56319840 56319856 56319872 56319888 56319904 56319920 56319936 56319952 56319968 56319984 56320000 56320016
在第二个 for
循环中打印什么?
最佳答案
What is being printed in the second for loop?
简短的回答是“这是垃圾”。它的官方名称是“未定义的行为”,但实际上您看到的是一系列任意十进制数字。
长答案有点棘手:您传递的是一维数组的 printf
地址,它被重新解释 为整数。请注意这些数字是如何以相同的步长 16 分开的。这是您系统上四个 int
的大小。
如果您想通过一维数组获取原始数字,您可以强制对数组进行不同的重新解释 - 作为指向 int
的指针:
int *ptr = (int*)&array;
for(i = 0; i < 16; i++){
printf("%d ", ptr[i]);
}
这会从二维数组中生成数字序列,数组在内存中的存储方式(逐行)。
关于c - 当我将二维数组读取为一维数组时,显示的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23919512/