这句话是正确的:
char *c[3] = {"abcd", "efgh", "jklm",};
这个虽然结构相似,但编译器不喜欢它。
int *a[3] = {{48,49,50,51}, {5,6,7,8}, {9,10,11,12},};
他们有什么不同?编译器不能从a
的初始化推断出大小吗?
在我看来,编译器会将char *
视为不同。
答案 0 :(得分:5)
与C字符串文字不同,后者产生一个以空白终止的数组“衰减”到指针。为了使用整数获得相同的功能,您需要使用复合文字。
C编译器将为"abcd"
及其空终止符分配内存,并为您提供指针。但是,编译器不会为整数数组{48,49,50,51}
分配内存,除非你告诉它文字代表一个整数数组:
int *a[3] = {
(int[]){48,49,50,51}
, (int[]){5,6,7,8}
, (int[]){9,10,11,12}
};
此功能在C99及更高版本中可用。如果您使用较旧的编译器,并希望您的a[]
是一个指针数组,则需要单独分配其元素:
static int a0[] = {48,49,50,51};
static int a1[] = {5,6,7,8};
static int a2[] = {9,10,11,12};
int *a[] = {a0, a1, a2};
这可以让你制作一个“锯齿状”阵列。如果您不想要锯齿状数组,因为a[]
中的所有行都具有相同的4
大小,您可以创建一个常规的3x4数组。