【问题标题】:Impact of int array's size on type equivalenceint 数组大小对类型等价的影响
【发布时间】:2009-04-14 19:43:28
【问题描述】:

我在我的编程语言课上阅读关于类型等价的内容,但我在 C 语言中遇到了一个我不确定的情况。

它将C的“类型等价”描述为:

C 使用一种介于名称和结构等价之间的类型等价形式,可以粗略地描述为“结构和联合的名称等价,其他一切的结构等价”。

如果我有两个不同大小但基类型相同的数组呢:

typedef int A1[10];  
typedef int A2[20];

既然我需要的只是结构等价,那么这两个是否可以被认为是结构上等价的?在 C 中,索引集的大小是数组类型的一部分还是不是?

【问题讨论】:

    标签: c type-equivalence


    【解决方案1】:

    不,他们不是。

    你可以试试sizeof(A1)sizeof(A2) 看看他们有什么不同。

    【讨论】:

      【解决方案2】:

      不,它们不是同一类型。

      在 C 中你不会得到错误,但在 C++ 中如果你尝试你会得到类似的错误:

      错误 C2440: 'initializing' : 无法从 'int ()[1024]' 转换为 'int ()[512]'

      这里是一些示例代码

      int x[1024];
      int y[512];
      /*Create a pointer int[1024] type*/
      int (*px)[1024] = &x;
      /*Create a pointer int[512] type*/
      int (*py)[512] = &y;
      
      int (*py2)[512] = &x; /*<---compiling error in C++ but allowed in C even know it's wrong*/
      

      即使知道 C 中允许最后一行,这两种类型也被认为是不同的。此外,数组与指向数组的指针不同,但如您所见,类型声明是不同的。

      【讨论】:

      • 但是在我的书中它说指针在 C 中是结构等价的。那么,如果一个数组是指向 n 个元素的指针,那么它们在结构上不是等价的吗?
      • 数组不是指针——在某些情况下它可以“​​分解”为指针,但它不等同于指针
      【解决方案3】:

      在源代码中,在某些情况下,不同类型的变量在给定表达式中是兼容的,编译器将调用足够的魔法来做正确/预期的事情,例如将数组作为参数传递给期望指针。 但是,这并不意味着它们的内存布局是兼容的。查看问题 Pointer vs array in C, non-trivial difference 我错过了。

      我不太清楚你的书所说的“结构等价”是什么意思,但想知道这是否可能指的是默认的整数提升(但似乎也包括数组?)。但无论如何,整数提升是一个非常重要的问题,你应该花时间去理解。下面的 printf 应按照这些规则执行:

      unsigned int i = 0;
      if (i < -1) {
              printf("This line is printed!\n");
      }
      

      C standard (ISO/IEC 9899:1990) 包含一个标题为“通常的算术转换”的部分,用于定义行为。该标准不是免费提供的(相反,它的售价相当昂贵,因为 ISO 标准按每页定价……),但如果您搜索该术语,您应该能够找到一些有用的信息或报价。一些标准草案是免费提供的,但是由于您不知道最终标准发生了什么变化,因此会威胁到那些非常不信任的人。

      【讨论】:

      • 真的吗?我没有遇到任何问题,但无论如何您应该能够搜索标题。
      猜你喜欢
      • 1970-01-01
      • 2018-07-02
      • 1970-01-01
      • 2017-06-30
      • 1970-01-01
      • 2015-10-21
      • 2016-10-26
      • 2011-12-29
      • 2012-05-20
      相关资源
      最近更新 更多