当我将二维数组作为一维数组读取时会显示什么?

Jos*_*ook 6 c arrays multidimensional-array

我试图理解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");

}
Run Code Online (Sandbox Code Playgroud)

我得到了这个奇怪的输出.

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 
Run Code Online (Sandbox Code Playgroud)

在第二个for循环中打印什么?

das*_*ght 4

第二个 for 循环中打印了什么?

简短的回答是“这是垃圾”。它的官方名称是“未定义的行为”,但它本质上是您看到的任意十进制数字的序列。

长答案有点棘手:您正在传递printf一维数组的地址,这些地址会被重新解释为整数。int请注意这些数字如何以相同的步长 16 分开。这是系统上4 的大小。

如果您想通过一维数组获取原始数字,您可以强制对数组进行不同的重新解释 - 作为指向以下内容的指针int

int *ptr = (int*)&array;
for(i = 0; i < 16; i++){
    printf("%d ", ptr[i]);
}
Run Code Online (Sandbox Code Playgroud)

这会从二维数组中生成数字序列,这是数组在内存中存储的方式(逐行)。

ideone 上的演示。