RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 632225
Accepted
MaximPro
MaximPro
Asked:2020-02-25 07:52:29 +0000 UTC2020-02-25 07:52:29 +0000 UTC 2020-02-25 07:52:29 +0000 UTC

复合文字或内部表示如何工作

  • 772

可能有些人知道复合文字是什么,并且知道如何在实践中使用它。

但是,我对这些文字的内部表示有疑问。

好吧,假设我有以下条目:int *a = (int[]){10, 20, 30};- 所以我创建了一个在内存中某处创建的 int 数组的地址并将其分配给指针。

我们可以假设条目:int *a = (int[]){10, 20, 30};- 等同于以下条目吗?

int arr[] = {10,20,30};
int *parr = arr;

分配复合文字地址的方案是什么?

c
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    AnT stands with Russia
    2020-02-25T09:19:15Z2020-02-25T09:19:15Z

    是的,你可以这样算。您正确编译的两个广告的类比。

    复合字面量的生命周期完全由指定它的声明区域决定,并且与在相同上下文中声明的相同类型的普通变量的生命周期相同。也就是说,复合文字只是具有相应初始值设定项的相应类型的未命名变量的类似物。


    然而,在 C 中有一个与此相关的微妙之处。在 C 中出现复合文字之前,没有单独的对象声明生命周期问题,例如,在分支中if

    if (...)
      int a = 5;
    else
      int b = 42;
    

    因为 C 中的声明不是也从来不是语句,所以这样的代码在 C 中是不正确的。要在 C 中创建允许变量声明的局部声明区域,您必须显式使用{}. 也就是说,C 中普通(命名)局部对象的生命周期总是由一个显式块概述,{}并通过块属性得到充分解释。

    然而,随着语言中复合文字的出现,这种形式出现了生命周期问题

    int *a, *b, *c;
    if (a = (int []) { 1, 2, 3 })
      b = (int []) { 4, 5, 6 };
    else
      c = (int []) { 7, 8, 9 };
    

    这种复合文字的生命周期应该是多长?他们应该在之后存在if吗?

    直到现在,它本身if和它在 C 语言中的分支都不是单独的声明区域——如上所述,没有必要这样做。然而,在 C99 中将复合文字引入语言后,决定遵循 C++ 路径并对此类文字的生命周期进行本地化。现在在 Cif中,它本身和它的分支都是隐式块,它们限制了在它们中创建的复合文字的生命周期(以及在它们中声明的名称的范围,见下文)。

    那些。现在,自 C99 以来,以上if内容等同于

    int *a, *b, *c;
    {
      if (a = (int []) { 1, 2, 3 })
      {
        b = (int []) { 4, 5, 6 };
      }
      else
      {
        c = (int []) { 7, 8, 9 };
      }
    }
    

    带来所有后果,即 带有“悬空”指针值。相同的修改适用于其他类型的语句。

    顺便说一句,这导致在许多很少使用的上下文中失去与“经典”C 的向后兼容性。例如,C 允许您sizeof在强制转换中声明新类型。利用C89/90中的这个特性,可以编写如下代码

    int foo(int a)
    {
      if (a == sizeof(enum { A }))
        a = sizeof(enum { B });
      else 
        a = sizeof(enum { C });
    
      return a + A + B + C; /* ОК в С89/90. Ошибка в C99 */
    }
    

    C99之后,由于引入了隐式块if,这样的代码就不能编译了。

    • 6
  2. Vlad from Moscow
    2020-02-25T08:02:08Z2020-02-25T08:02:08Z

    复合文字创建一个未命名的对象。它的存储期限取决于它是定义在函数内部还是函数外部。如果复合文字在函数外部声明,则它具有静态存储持续时间,否则它具有自动存储持续时间。

    此条目

    int *a = (int[]){10, 20, 30}; 
    

    相当于

    int arr[] = {10,20,30};
    int *a = arr;
    
    • 3

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5