c - 当我将二维数组读取为一维数组时,显示的是什么?

标签 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");

}

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

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]);
}

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

Demo on ideone.

关于c - 当我将二维数组读取为一维数组时,显示的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23919512/

相关文章:

c - 输出是什么?请解释一下,考虑到我是c新手

c - 多维字符数组?

c - 执行c程序时显示"Abnormal program termination"

c - 什么是更好地实现以下目标 - poll、inotify 或其他任何东西

c - 如何从 C 中的字符串中获取和评估表达式

java - 为什么我在 Matrix 中填写 Integer.MAX_VALUE

c++ - 如何在 Visual Studio 中的静态库中隐藏类

javascript - 如何将 servlet 中的字符串解析为 javascript 并创建包含数组值的格式化对象

javascript - 从 Angular 6 中的对象中删除值

javascript - 无法使用 ng-repeat 访问内部对象数组