C 可变长度数组存储持续时间

2024-04-10

On this http://en.cppreference.com/w/c/language/storage_duration网站上有以下段落(强调我的):

  • 自动存储时间。当进入声明对象的块时分配存储空间,并在通过任何方式(goto、return、到达末尾)退出时释放存储空间。 VLA 是一个例外;它们的存储是在执行声明时分配的,而不是在块条目时分配的,然后释放的当声明超出范围时,而不是退出块时(C99 起)。如果递归地输入块,则为每个递归级别执行新的分配。所有函数参数和非静态块作用域对象以及块作用域中使用的复合文字都具有此存储持续时间。

声明超出范围和块退出有什么区别?你能举个例子吗?


来自 C11 规范的 N1570 草案 §6.2.4/7

对于这样一个确实具有可变长度数组类型的对象,其 生命周期从对象的声明延伸到执行 该程序离开了声明的范围。

然后该规范添加了以下有用的注释:

离开包含声明的最里面的块,或者跳转到 该块中的一个点或声明之前的嵌入块, 离开声明的范围。

因此,当执行超出 VLA 范围(包括 VLA 声明之前同一块中的部分)时,VLA 就会被解除分配。

可以使用以下命令跳转到声明之前的点goto陈述。例如:

int n = 0;
while (n < 5)
{
top:
    n++;
    char array[n];
    if (n < 2)
        goto top;
}

在此代码中,当goto被执行。然而,价值n变化,所以一个新的array需要分配。这就是规范试图支持的极其复杂的情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 可变长度数组存储持续时间 的相关文章

  • 将控件的属性保存到 xml

    我想将控件的部分 所有属性保存到 xml 例如 listivew 的列宽就像 listView1 SaveToXml listview xml 这怎么可能 Via the XML序列化器 http msdn microsoft com en
  • 按属性值对结构体数组进行排序

    我在 C 中有一个任务 使用 qsort 对结构进行排序 struct user enum SEX m f sex char name 32 char phonenr 32 typedef struct user User 用户将存储在一个
  • 查询父实体时导航属性为空

    下面是我的域实体的基类 public interface IBaseEntity public int Id get set public DateTime CreatedDate get set public DateTime Updat
  • 如何找到给定数组的所有可能的子集?

    我想在 C 或 C 中提取数组的所有可能子集 然后计算所有子集数组各自元素的总和 以检查其中有多少等于给定数字 我正在寻找的是算法 我确实理解这里的逻辑 但我现在还无法实现这一逻辑 考虑一组S of N元素 以及给定的子集 每个元素要么属于
  • Task.Run 如何受 CPU 内核限制?

    为什么下面的程序只会运行有限数量的阻塞任 务 限制数量似乎是机器上的核心数量 最初 当我写这篇文章时 我希望看到以下内容 作业 1 24 的作业完成输出 2秒的间隙 工作产出 25 48 然而输出是 作业 1 4 的作业完成输出 然后每隔
  • C# - 如何在变量名中使用无效字符

    在 C 中 我正在构建一个类 出于讨论目的而在此处进行了简化 该类最终将被序列化为一些外部定义的 JSON schema http example com person json name John age 86 在我的代码中我会有类似的内
  • 显示函数的完全限定名称

    include
  • C:epoll和多线程

    我需要创建专门的 HTTP 服务器 为此我计划使用 epoll sycall 但我想利用多个处理器 核心 但我无法提出架构解决方案 ATM我的想法如下 使用自己的epoll描述符创建多个线程 主线程接受连接并将它们分配给线程epoll 但还
  • 使用 decltype() 声明函数签名

    是否可以声明一个函数bar与函数具有相同的签名foo int foo int a return 0 decltype foo bar return 1 imaginary syntax 我认为这同样适用于 typedef 和别名 您可以使用
  • 修改文件流

    我现在正在开发一个允许编辑非常大的文本文件 4Gb 的类 嗯 这可能听起来有点愚蠢 但我不明白如何修改流中的文本 这是我的代码 public long Replace String text1 String text2 long repla
  • ns_initparse 的链接器错误

    这是代码 include
  • 如何使用 System.Json 进行漂亮的打印?

    使用新的System Json 从 4 5 开始 http msdn microsoft com en us library system json 28v vs 95 29 aspx或同等的来自 Nuget 的 4 0 的 System
  • 在哪里可以找到 C 语言的位移指南? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我看过什么是按位移位 bit shift 运算符以及它们如何工作 https stackoverflow com questions
  • C++ 将浮点数转换为无符号字符?

    我是 C 新手 我想做了一些谷歌搜索sprintf可以完成这项工作 但是编译时出现错误 无法在unsigned char and a char 我需要一个无符号字符 因为我要打印到图像文件 0 255 RGB unsigned char p
  • 以系统帐户运行exe

    我正在尝试将我的 c exe 作为系统帐户运行 我怎样才能做到这一点 我试过了
  • 使用相同的 SqlConnection 对 SqlCommand.BeginExecuteNonQuery 进行多个并发调用

    我有一些可用的 C 代码 它使用 SqlConnection 创建临时表 例如 Foo 调用存储过程来填充这些临时表并将结果返回到 C 客户端 使用 C 对这些结果执行复杂的计算 并使用计算结果更新之前创建的临时表之一 由于整个过程中都会使
  • 避免调用成员变量的构造函数

    我有以下 C 类 Header File class A public A private B m B C m C cpp File A A m B 1 m B doSomething m B doMore m C C m B getSom
  • 使用 cmake 和 opencv 对符号“gzclose”的未定义引用[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我尝试构建该项目 doppia https bitbucket org rodrigob doppia 但发生链接错误 我想这是一
  • 为 Visual Studio 安装 openCV 2.4 for C/C++

    我一整天都在尝试在 Windows 7 上的 C C 上安装 Visual Studio 2010 的 OpenCV 版本 2 4 1 和 2 4 2 我一直在关注这个教程 http docs opencv org trunk doc tu
  • 使用 Linq 获取当前和上一个项目

    我有一个 Offer 类 例如 public class Offer public int OfferID get set public DateTime OfferDate get set public int CustomerID ge

随机推荐

  • 在 SwiftUI 中,如何添加循环视频作为全屏背景图像?

    我有一个大约 10 秒长的视频 我想在我的一个 SwiftUI 视图中作为全屏背景图像循环播放 我怎样才能实现这个 第一个想法是与 Swift 合作import AVFoundation 但不确定这是否是正确的道路 您可以使用AV框架系列和
  • Chrome 在使用位置粘性/固定时会切断重影图像

    我正在尝试使用 HTML5 拖放position fixed从位于屏幕左侧固定位置的菜单中拖动元素 以下代码在 Safari 和 Firefox 中运行良好 但当我在 Chrome 中尝试时 滚动后 从拖放 API 生成的 幽灵 图像不可见
  • Leaflet.js:如何从地图中删除多个图层

    我正在使用 Leaflet js 制作地图 现在我想从地图中删除添加的图层 通过单击输入 按钮 所有选中的复选框将更改为未选中 并且所有相应的图层将从地图中删除 要从地图中删除图层 需要该图层的 ID 该 id 等于相应复选框的 id 这就
  • 如何使用 mysqli 准备好的语句绑定 N 个参数?

    在旧的 mysql 代码中 我有一个完美运行的查询 如下所示 questioncontent isset GET questioncontent GET questioncontent searchquestion questioncont
  • 如何检测用户何时成功完成php中文件的下载

    我有一个处理文件下载请求的 php 页面 我需要能够检测文件何时已成功下载 如何才能做到这一点 也许有一些方法可以检测该客户端 然后向服务器发送确认 Thanks 编辑 通过句柄 我的意思是该页面正在执行以下操作 file var www
  • Android - 应用程序安装在 SD 卡上时内部存储与外部存储

    我有一个可以下载大量内容的应用程序 用户之间有所不同 但可能是 200mb 到 1GB 或更多 目前 我将所有这些内容保存在外部存储上 因为这可能是空间最多的区域 例如 SD 卡 这在大多数情况下都可以正常工作 但在某些情况下这不一定是理想
  • Clojure 是否有命名私有函数的约定?

    当我在 Clojure 中定义私有函数时 我通常使用 前缀作为视觉指示符 表明该函数不能在我的命名空间之外使用 例如 defn name let formatter formatter yyyy MM dd HH mm ss SSSS fo
  • HTML5 push/replaceState 和 标签导致安全异常

    我有一个网站的测试版本 位于正常网站的子域中 例如 http test x com http test x com代替http x com http x com 我用标签将所有资源请求转换回原始域 在我实现 HTML5 Push repla
  • 对象或原始类型

    有人可以向我解释一下在 JAVA 中如何使用 Integer Boolean 等来代替它们的原始类型吗 我似乎无法理解他们提供的优势 它们似乎在处理空值时造成了不必要的问题 Thanks Boolean Integer Long 是对象 您
  • android ndk 未定义对方法的引用

    您好 很抱歉这篇长文章我正在尝试编译一些静态类 即 jsmn c json c 和 buf c 它们是我从下载的 jsmn json 库的一部分https github com alisdair jsmn example downloads
  • 如何使用spark-submit为Spark作业选择队列?

    有没有办法提供参数或设置来选择我希望运行 Spark submit 作业的队列 通过使用 queue 因此 火花提交作业的一个示例是 Spark submit master YARN conf Spark executor memory 4
  • Dash 数据表下载至 Excel

    我目前正在使用下面的脚本从我创建的破折号下载数据表 下载工作正常 但是当我在本地托管 Dash 并尝试通过另一个系统单击下载按钮时 文件正在主机上下载 而不是在用户计算机上下载 如果我的问题看起来很愚蠢 我深表歉意 因为我对 Dash 和
  • scala 中可以有命名常量吗?

    看起来 Java 中的注释需要常量 我想做 object ConfigStatics final val componentsToScan Array com example PropertySource ConfigStatics com
  • 由于 lambda 表达式,缩小失败

    当 ASP NET 捆绑程序尝试缩小以下脚本时 它会失败 Minification failed Returning unminified contents 164 59 60 run time error JS1195 Expected
  • 为什么改变 SO_RCVBUF 的值不起作用?

    我正在制作一个程序 它创建一个原始套接字以读取所有流量 在调用socket 和recvfrom 之间 最后一个在循环中从缓冲区中取出所有数据包 我等待了5秒 当我运行该程序时 我使用 hping3 命令以 更快的模式 以快速填充缓冲区 向我
  • ASP.Net MVC Ajax.BeginForm OnComplete 在 Razor 视图中传递 C# 参数

    我在 MVC c Razor 视图中有以下代码 string url Projects MonthRangesScriptsPartial using Ajax BeginForm MonthRanges Projects new id V
  • SQL Server 的 SELECT JOIN 语句导致的死锁

    当执行带有两个表的 JOIN 的 SELECT 语句时 SQL Server 似乎 分别锁定语句的两个表 例如通过像这样的查询 这 SELECT FROM table1 LEFT JOIN table2 ON table1 id table
  • 求 O(log n) 中值

    问题是我们如何找到整数值接收流的中位数 例如 对于 12 14 252 243 15 中位数是 15 O log N 其中 N 是值的数量 请注意 我们有一个整数值流 因此通过接收每个值 我们必须重新找到中位数 例子 Input media
  • 如何修复 Nodejs 中的“无法读取未定义的属性推送”错误?

    我编写了一个简单的应用程序来学习 Nodejs 但是当我在 cmd 中运行 nodemon index js 时出现此错误 类型错误 无法读取未定义的属性 push 应用程序崩溃 启动前等待文件更改 我已遵循 udemy 课程中的所有说明来
  • C 可变长度数组存储持续时间

    On this http en cppreference com w c language storage duration网站上有以下段落 强调我的 自动存储时间 当进入声明对象的块时分配存储空间 并在通过任何方式 goto return