这两个定义与编译器有何不同?

Hai*_*iri 2 c

这句话是正确的:

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 *不同的.

das*_*ght 5

与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数组.

  • 复合文字*不是*扩展名.它们是C99的一部分,见于C99标准草案n1256*6.5.2.5复合文字* (3认同)