这些声明之间的区别是什么?
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)无效?
发布于 2013-10-23 12:53:35
char **strings
是指向char
指针的指针。它是一个有效的类型,但是你不能像你想做的那样用数组初始化器初始化它。
char *strings[]
是一个指向char
的指针数组,您对它的初始化是有效的。
char strings[][]
是一种创建二维数组的尝试,但它是错误的,因为您必须指定除最外层之外的所有维度的大小(最外层的大小可以从初始值设定项推导出)。所以这将是有效的:
char strings[][4] = {"abc", "bca", "rat", "tar", "far"};
发布于 2013-10-23 13:08:37
C99支持复合文字,因此可以分配一个数组初始值设定项。因此,情况1也适用于:
char **strings = (char *[]) {"abc", "bca", "rat", "tar", "far"};
C99 draft,6.5.2.5,复合文字
约束
1类型名称应指定对象类型或大小未知的数组,但不能指定可变长度数组类型。
2任何初始值设定项都不应尝试为未包含在由复合文字指定的整个未命名对象中的对象提供值。
3如果复合文字出现在函数体之外,则初始化器列表应由常量表达式组成
发布于 2013-10-23 12:58:28
1) char **字符串是一个指向指针的指针声明,它期望的是一个数字的属性,而不是字符串数组的属性。
2)尝试定义[]中的大小: char *strings5={....
3)再次定义数组的大小,x=元素数,y=最大元素的字符数
https://stackoverflow.com/questions/19542170
复制相似问题