首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C中的字符串数组声明

C中的字符串数组声明
EN

Stack Overflow用户
提问于 2013-10-23 12:48:59
回答 3查看 11.1K关注 0票数 5

这些声明之间的区别是什么?

1.

代码语言:javascript
运行
AI代码解释
复制
char **strings = {"abc", "bca", "rat", "tar", "far"};

2.

代码语言:javascript
运行
AI代码解释
复制
char *strings[] = {"abc", "bca", "rat", "tar", "far"};

3.

代码语言:javascript
运行
AI代码解释
复制
char strings[][] = {"abc", "bca", "rat", "tar", "far"};

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-23 12:53:35

char **strings是指向char指针的指针。它是一个有效的类型,但是你不能像你想做的那样用数组初始化器初始化它。

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

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

代码语言:javascript
运行
AI代码解释
复制
char strings[][4] = {"abc", "bca", "rat", "tar", "far"};
票数 12
EN

Stack Overflow用户

发布于 2013-10-23 13:08:37

C99支持复合文字,因此可以分配一个数组初始值设定项。因此,情况1也适用于:

代码语言:javascript
运行
AI代码解释
复制
char **strings = (char *[]) {"abc", "bca", "rat", "tar", "far"};

C99 draft,6.5.2.5,复合文字

约束

1类型名称应指定对象类型或大小未知的数组,但不能指定可变长度数组类型。

2任何初始值设定项都不应尝试为未包含在由复合文字指定的整个未命名对象中的对象提供值。

3如果复合文字出现在函数体之外,则初始化器列表应由常量表达式组成

票数 2
EN

Stack Overflow用户

发布于 2013-10-23 12:58:28

1) char **字符串是一个指向指针的指针声明,它期望的是一个数字的属性,而不是字符串数组的属性。

2)尝试定义[]中的大小: char *strings5={....

3)再次定义数组的大小,x=元素数,y=最大元素的字符数

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19542170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档