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

时间:2016-09-17 13:06:55

标签: c

这句话是正确的:

char *c[3] = {"abcd", "efgh", "jklm",};

这个虽然结构相似,但编译器不喜欢它。

int *a[3] = {{48,49,50,51}, {5,6,7,8}, {9,10,11,12},};

他们有什么不同?编译器不能从a的初始化推断出大小吗?

在我看来,编译器会将char *视为不同。

1 个答案:

答案 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数组。