C如何确定数组的界限?

时间:2017-08-07 14:33:10

标签: c multidimensional-array

我正在研究C上的数组。目前,我正在运行此代码

#include <stdio.h>

signed char cData[][2][3] = {1,2,3,4,5,6};

int main() 
{
    printf("%d\n", cData[0][0]);
    return 0;
}

答案是4210700 我想知道如何确定第一个界限? 我怎么得到号码4210700而不是1

3 个答案:

答案 0 :(得分:5)

cData[0][0]基本上是指针(signed char *类型),您需要%p说明符。

printf("%p\n", (void *)cData[0][0]);

答案 1 :(得分:4)

此声明

signed char cData[][2][3] = {1,2,3,4,5,6};

是一个聚合声明。你可以用以下方式重写它

typedef signed char T[2][3];
T cData[] = {1,2,3,4,5,6};

反过来,类型T是一种聚合类型。其成员的类型为signed char[3].

根据C标准(6.7.9初始化)

  

17每个括号封闭的初始化列表都有一个关联的电流   宾语。如果没有指定,则当前的子对象   根据当前的类型按顺序初始化对象   object :增加下标顺序,结构的数组元素   声明顺序的成员,以及工会的第一个指定成员......

  

20如果聚合或联合包含元素或成员   聚合或联合,这些规则递归地应用于   分包或包含工会。如果是初始化者   subaggregate或contains union以左括号开头   由该支撑包围的初始化器及其匹配的右支撑   初始化子聚合的元素或成员或   包含工会。 否则,列表中只有足够的初始值设定项   用于说明子集合的元素或成员   或者所包含的联盟的第一个成员;任何剩余的初始化者   留下来初始化下一个元素或聚合的成员   当前的分包或包含的联合是其中的一部分。

首先,初始化类型signed char[3]的最内部聚合。然后初始化类型signed char[2][3]的聚合的第二个成员。反过来,它是signed char [][2][3]类型聚合的成员。因此,这个聚合的一个成员只有一个初始化器。

结果cDara的类型为signed char[1][2][3]

表达式cData[0][0]具有类型signed char [3],它在函数调用中被隐式转换为指向其第一个元素的指针。

所以在这个陈述中

printf("%d\n", cData[0][0]);

您正尝试将地址输出为signed int,通常具有未定义的行为。

如果要将第一个元素作为整数输出,则应编写

printf("%d\n", cData[0][0][0]);

答案 2 :(得分:0)

你忘记了一对括号

     printf("%d\n", cData[0][0][0]);

初始化的工作原理:填充第一维,然后填充第二维和第三维。根据初始化和大括号的数量,确定最低要求