c -将二维数组读取为一维数组时显示的内容



我试图理解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循环中打印的是什么?

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

简短的回答是"这是垃圾"。它的正式名称是"未定义行为",但本质上你看到的是一串任意的十进制数字。

长答案有点棘手:您正在传递一维数组的printf地址,这会将重新解释为整数。注意这两个数字是如何相差16步的。这是系统中四个int的大小。

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

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

这从你的2D数组中生成数字序列,数组存储在内存中的方式(逐行)。

二维数组被认为是一维数组中的一维数组。它正在打印1D数组的地址,但您应该使用%p说明符来打印地址,否则它会调用未定义行为

for(i = 0; i < 4; i++){
    printf("%p", (void *)array[i]);    
}  

int array[4][4]是包含16个整数的2D数组,或者可以说array是包含4个int的1D数组的1D数组。

你应该注意,只有你的程序调用未定义的行为有两个原因:
1. 错误的指定符%d用于打印地址。
2. 您在最后一个循环中访问超出边界。for(i = 0; i < 16; i++)应为for(i = 0; i < 4; i++)

相关内容

  • 没有找到相关文章

最新更新