c - 为什么在二维数组初始化中只有列大小有效而只有行大小无效?

标签 c arrays

这行得通

 int a[][2]={
               {2,4},
               {6,8}
            };

但这显示错误

int a[2][]={
              {2,4},
              {6,8}
           };

为什么只给出列大小不显示错误,但只给出行大小却显示错误?

最佳答案

在 C 中,您只能省略第一维的长度。对于一维数组,你可以这样做

int oneD_array[2] = {1,2};

int oneD_array[] = {1,2};  

如果是二维数组,两者都是

int twoD_array[2][2] = {  {2,4}, {6,8} };

int twoD_array[][2] = {  {2,4}, {6,8} }; 

有效。
但是上面的声明只有在初始化器存在的情况下才有效。否则会报错。
编译器使用初始值设定项的长度来确定数组的长度。但是不能通过这种方式确定列的长度。在不知道数组长度的情况下,编译器无法计算出其对应元素的地址。通过知道行和列的长度,编译器使用数组等式计算其元素的地址:

address(array) = address(first element) + (row number * columns + column number)*sizeof)type)  

详细看array equation :

C 中的二维数组被视为一维数组,其元素是一维数组(行)。

例如,T4x3 数组(其中T 是某种数据类型)可以声明为:T mat [4][3],并用以下方案描述:

                       +-----+-----+-----+
  mat == mat[0]   ---> | a00 | a01 | a02 |
                       +-----+-----+-----+
                       +-----+-----+-----+
         mat[1]   ---> | a10 | a11 | a12 |
                       +-----+-----+-----+
                       +-----+-----+-----+
         mat[2]   ---> | a20 | a21 | a22 |
                       +-----+-----+-----+
                       +-----+-----+-----+
         mat[3]   ---> | a30 | a31 | a32 |
                       +-----+-----+-----+

数组元素逐行存储在内存中,所以T类型的元素mat[m][n]的数组方程为:

address(mat[i][j]) = address(mat[0][0]) + (i * n + j) * size(T)

address(mat[i][j]) = address(mat[0][0]) + 
                     i * n * size(T)    + 
                     j * size(T)

address(mat[i][j]) = address(mat[0][0]) + 
                     i * size(row of T) + 
                     j * size(T)

关于c - 为什么在二维数组初始化中只有列大小有效而只有行大小无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21169951/

相关文章:

c - typedef 定长数组

c - gcc编译器在编译时在哪里寻找头文件?

c - 使用指针对 3 个 double 值进行排序

c - printf 喜欢的行为?

javascript - 按键值过滤和分组

javascript - 在 JavaScript 中的数组中查找连续子数组的优雅方法?

c - 传递 'func' 的参数 1 会丢弃指针目标类型中的 'restrict' 限定符

c - getline()/strsep() 组合导致段错误

php - php uncompress&unpack给出包含一些(10309中的9个)未定义值的数组

c++ - 错误 : declaration of ‘data’ as array of references