2013-10-23 136 views
5

这些声明之间的区别?c中的字符串数组声明

1.

char **strings = {"abc", "bca", "rat", "tar", "far"}; 

2.

char *strings[] = {"abc", "bca", "rat", "tar", "far"}; 

3.

char strings[][] = {"abc", "bca", "rat", "tar", "far"}; 

只有(2)是一个有效的声明。这些类型之间有什么区别,为什么(1)和(3)无效?

+3

谁说,只有2是有效的? –

+0

如果我编译并尝试仅打印2)正在工作。 –

+0

这取决于你如何定义有效。作为“有效声明”,它们都是有效的。对于2 dim-arr,只有2是有效的。 –

回答

11

char **strings是指向char的指针。这是一个有效的类型,但是当你试图做的时候,你不能用数组初始值设定来初始化它。

char *strings[]是指向char的指针数组,您的初始化是有效的。

char strings[][]是尝试制作二维数组,但它是错误的,因为您必须指定除最外侧之外的所有维的大小(最外侧的大小可以从初始值设定项中推导出来)。因此,这将是有效的:

char strings[][4] = {"abc", "bca", "rat", "tar", "far"}; 
1

1)字符**串是一个指向指针的指针的声明,它expecteds编号不字符串数组的归属。

2)尝试定义[]内的尺寸:字符*串[5] = {....

3)再次,定义阵列的大小,[X] [Y],其中x =元素的数量和y =最大元素的字符数

2

C99支持复合文字,因此您可以分配数组初始值设定项。所以壳体1还细跟:

char **strings = (char *[]) {"abc", "bca", "rat", "tar", "far"}; 

C99草案,6.5.2.5,复合文字

约束

1类型名称应当指定一个对象类型或阵列 未知大小,但不是可变长度数组类型。

2没有初始值设定程序应尝试为包含在由复合词 指定的整个未命名对象内的对象 提供值。

3如果复合文字发生功能的主体之外,则 初始化列表应包括常量表达式