这句话是正确的:
char *c[3] = {"abcd", "efgh", "jklm",};
Run Code Online (Sandbox Code Playgroud)
这个虽然结构相似,但编译器不喜欢它.
int *a[3] = {{48,49,50,51}, {5,6,7,8}, {9,10,11,12},};
Run Code Online (Sandbox Code Playgroud)
他们有什么不同?编译器不能从初始化推断出大小a?
在我看来,编译器对待char *不同的.
与C字符串文字不同,后者产生一个"衰减"到指针的空终止数组.为了使用整数获得相同的功能,您需要使用复合文字.
C编译器将"abcd"为其及其null终止符分配内存,并为您提供指针.但是,编译器不会为整数数组分配内存,{48,49,50,51}除非你告诉它文字代表一个整数数组:
int *a[3] = {
(int[]){48,49,50,51}
, (int[]){5,6,7,8}
, (int[]){9,10,11,12}
};
Run Code Online (Sandbox Code Playgroud)
此功能在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};
Run Code Online (Sandbox Code Playgroud)
这可以让你做一个"锯齿状"的数组.如果您不想要锯齿状数组,因为所有行a[]的大小都相同4,您可以创建一个常规的3x4数组.