我正在研究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
我想知道c如何确定第一个界限?
我怎么得到号码4210700
而不是1
?
答案 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]);
初始化的工作原理:填充第一维,然后填充第二维和第三维。根据初始化和大括号的数量,确定最低要求