它们的分配如下:
1 2 3
4 5 0
零是因为你分配了一个大小为 6 的数组,但只指定了 5 个元素。
这称为“行主要顺序”。
您可能希望稍微形式化您的代码。您的代码目前是:
int a[2][3] = {1,2,3,4,5};
如果你用gcc main.c -Wall -pedantic --std=c99 编译它,你会收到一些警告:
temp.c:2:17: 警告:初始化器 [-Wmissing-braces] 周围缺少大括号
解决这个问题
int a[2][3] = {{1,2,3,4,5}};
这会给你一个新的警告:
temp.c:2:25: 警告:数组初始值设定项中的多余元素
解决这个问题:
int a[2][3] = {{1,2,3},{4,5,0}};
这明确表示数据具有两行,每行三个元素。
关于内存布局的一些想法
int a[2][3] 将产生一个“数组数组”。这类似于“指向数组的指针数组”,但又有所不同。两者都有相似的访问语法(例如a[1][2])。但只有“数组数组”才能使用a+y*WIDTH+x 可靠地访问元素。
一些代码可能会澄清:
#include <stdlib.h>
#include <stdio.h>
void PrintArray1D(int* a){
for(int i=0;i<6;i++)
printf("%d ",a[i]);
printf("\n");
}
int main(){
//Construct a two dimensional array
int a[2][3] = {{1,2,3},{4,5,6}};
//Construct an array of arrays
int* b[2];
b[0] = calloc(3,sizeof(int));
b[1] = calloc(3,sizeof(int));
//Initialize the array of arrays
for(int y=0;y<2;y++)
for(int x=0;x<3;x++)
b[y][x] = a[y][x];
PrintArray1D(a[0]);
PrintArray1D(b[0]);
}
当你运行它时,你会得到:
1 2 3 4 5 6
1 2 3 0 0 0
打印b 给出零(在我的机器上),因为它运行到未初始化的内存中。结果是使用连续内存可以让你做一些方便的事情,让设置所有值而不需要双循环。