【问题标题】:string array declaration in c [closed]c中的字符串数组声明[关闭]
【发布时间】:2013-10-23 12:48:59
【问题描述】:

这些声明之间的区别?

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)无效?

【问题讨论】:

  • 谁说只有2个有效?
  • 如果我编译并尝试仅打印 2) 工作正常。
  • 这取决于您如何定义有效。作为“有效声明”,它们都是有效的。对于 2 dim-arr,只有 2 有效。
  • @SharonJDDorot C 标准定义了什么是有效的。 #1 和 #3 无效。
  • @interjay 正如我所说,为了声明一个字符串数组,是的,它是无效的。但是他说 1 和 3 是无效的声明,而不是无效的数组定义。您当然可以使用所有 3 种形式,但用于不同类型的操作。

标签: c arrays string pointers


【解决方案1】:

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

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

char strings[][] 是尝试制作一个二维数组,但这是错误的,因为您必须指定除最外层之外的所有维度的大小(最外层的大小可以从初始化程序中推导出)。所以这是有效的:

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

【讨论】:

    【解决方案2】:

    C99 支持复合文字,因此您可以分配数组初始值设定项。所以案例1也可以:

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

    C99 草案,6.5.2.5,复合文字

    约束

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

    2 任何初始化程序都不应尝试为未提供的对象提供值 包含在复合指定的整个未命名对象中 字面意思。

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

    【讨论】:

      【解决方案3】:

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

      2) 尝试在 [] 中定义大小: char *strings[5]={....

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-11
        • 2013-05-25
        • 2014-01-14
        • 1970-01-01
        • 2012-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多