可能有些人知道复合文字是什么,并且知道如何在实践中使用它。
但是,我对这些文字的内部表示有疑问。
好吧,假设我有以下条目:int *a = (int[]){10, 20, 30};- 所以我创建了一个在内存中某处创建的 int 数组的地址并将其分配给指针。
我们可以假设条目:int *a = (int[]){10, 20, 30};- 等同于以下条目吗?
int arr[] = {10,20,30};
int *parr = arr;
分配复合文字地址的方案是什么?
可能有些人知道复合文字是什么,并且知道如何在实践中使用它。
但是,我对这些文字的内部表示有疑问。
好吧,假设我有以下条目:int *a = (int[]){10, 20, 30};- 所以我创建了一个在内存中某处创建的 int 数组的地址并将其分配给指针。
我们可以假设条目:int *a = (int[]){10, 20, 30};- 等同于以下条目吗?
int arr[] = {10,20,30};
int *parr = arr;
分配复合文字地址的方案是什么?
是的,你可以这样算。您正确编译的两个广告的类比。
复合字面量的生命周期完全由指定它的声明区域决定,并且与在相同上下文中声明的相同类型的普通变量的生命周期相同。也就是说,复合文字只是具有相应初始值设定项的相应类型的未命名变量的类似物。
然而,在 C 中有一个与此相关的微妙之处。在 C 中出现复合文字之前,没有单独的对象声明生命周期问题,例如,在分支中
if因为 C 中的声明不是也从来不是语句,所以这样的代码在 C 中是不正确的。要在 C 中创建允许变量声明的局部声明区域,您必须显式使用
{}. 也就是说,C 中普通(命名)局部对象的生命周期总是由一个显式块概述,{}并通过块属性得到充分解释。然而,随着语言中复合文字的出现,这种形式出现了生命周期问题
这种复合文字的生命周期应该是多长?他们应该在之后存在
if吗?直到现在,它本身
if和它在 C 语言中的分支都不是单独的声明区域——如上所述,没有必要这样做。然而,在 C99 中将复合文字引入语言后,决定遵循 C++ 路径并对此类文字的生命周期进行本地化。现在在 Cif中,它本身和它的分支都是隐式块,它们限制了在它们中创建的复合文字的生命周期(以及在它们中声明的名称的范围,见下文)。那些。现在,自 C99 以来,以上
if内容等同于带来所有后果,即 带有“悬空”指针值。相同的修改适用于其他类型的语句。
顺便说一句,这导致在许多很少使用的上下文中失去与“经典”C 的向后兼容性。例如,C 允许您
sizeof在强制转换中声明新类型。利用C89/90中的这个特性,可以编写如下代码C99之后,由于引入了隐式块
if,这样的代码就不能编译了。复合文字创建一个未命名的对象。它的存储期限取决于它是定义在函数内部还是函数外部。如果复合文字在函数外部声明,则它具有静态存储持续时间,否则它具有自动存储持续时间。
此条目
相当于