【问题标题】:Impossible multi-dimensional array in CC中不可能的多维数组
【发布时间】:2021-05-06 18:21:06
【问题描述】:

我正在阅读一些关于 C 编程的介绍性材料。 给出了以下示例:

int matrix[][] = {{ 1,2,3}, {5,6,7}};

由于 gcc(在我的情况下为 7.5.0)和 clang(在我的情况下为 6.0.0)无法编译,我尝试了几种 C 标准(c89、c90),但都没有成功。

是否存在有效的 C 标准版本?

【问题讨论】:

  • I was reading some introductory material on programming in C. The following example was presented 我会建议另一本 C 书籍或教程。
  • f2003 甚至不是 C 标准。这是 Fortran!

标签: c c99


【解决方案1】:

在 C 中是不合法的。错误信息不言自明:

“矩阵”声明为多维数组必须有边界 除第一个维度外的所有维度

您需要提供除第一个以外的所有尺寸:

int matrix[][3] = {{ 1,2,3}, {5,6,7}};
int matrix[][2][3] = {{{ 1,2,3}, {5,6,7}}, {{ 1,2,3}, {5,6,7}}};
/* etc etc*/

是否存在有效的 C 标准版本?

没有

【讨论】:

    【解决方案2】:

    让我们看看你的语法:

    int matrix[][] = {{ 1,2,3}, {5,6,7}};
    

    在这里,在C language 中,您需要声明除first one(which is optional) 之外的所有维度的大小,而这里您没有声明second dimension,所以很明显它会给您一个syntax errorC 中无效。

    如果我们采用变量x,那么在generalized form 中我们可以说correct syntax 是:

    int matrix[][x] = {{1,2,3,...., x terms}, {1,2,3,....,x terms},.... upto your desired no. of terms};
    

    对于你的数组:

    int matrix[][3] = {{1,2,3},{5,6,7}};
    

    下面给出一些示例供您参考:

    int matrix[] = {1,2,3};
    int matrix[][4] = {{1,2,3},{4,5,6,7}};
    int matrix[][4][5] = {{1,2},{3,4,5,6},{7,8,9,10,11}};
    int matrix[][5][3] = {{1,2,3,4,5,6},{7,8,9,10,11},{12,13,14}};
    

    现在,让我们来回答你的最后一个问题:

    Is there any version of standard C which allows to do so?

    答案是:No! 目前有 no such versionC 可用,这使我们可以这样做。你should followstrict syntax convention

    希望这个解释对你有帮助!

    【讨论】:

      【解决方案3】:

      C 旨在允许单次处理的可能性。给定如下声明:

      int foo[][4] = {{1,2,3},{4,5,6,7}};
      

      编译器可以在读取它们时开始将它们放入内存中。当它找到第一个右大括号时,它会知道它需要在 4 之前插入空格,因为它会知道它有输出 3 个值但内部维度是 4。如果构造改为:

      int foo[][] = {{1,2,3},{4,5,6,7}};
      

      编译器无法知道在 3 之后直到读取 7 之后需要空间,此时它已经将值 1 到 6 写入连续的存储位置。虽然可以想象某些实现可能会使用多遍扫描,因此它们可以扩展语言以适应这种结构,但我不希望任何编译器供应商期望收益来证明成本是合理的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-07
        • 2011-04-26
        • 2012-07-14
        • 1970-01-01
        • 1970-01-01
        • 2016-07-15
        • 1970-01-01
        相关资源
        最近更新 更多