声明中的数组长度可以是非常量吗?

2023-12-07

我对 C 中的数组声明有点困惑。我知道可以这样做:

int a[20];  // Reserved space for 20 int array
int b[] = {32, 431, 10, 42};  // Length in square brackets is auto-calculated
int *c = calloc(15, sizeof(int));  // Created a pointer to the dynamic int array

但是可以这样做吗?:

int my_array[sizeof(int) * 5];

它是一个有效的代码,还是一个数组长度应该是一个常量表达式(在 ANSI C 中)?


本声明

int my_array[sizeof(int) * 5];

没有声明变长数组,因为表达式sizeof(int) * 5是一个常量整数表达式。因此,即使您的编译器不支持可变长度数组,您也可以使用这样的声明。

来自 C 标准(6.6 常量表达式)

6 整数常量表达式117) 应具有整数类型并且应 仅具有整数常量、枚举常量的操作数, 字符常量、结果为整数的 sizeof 表达式 常量和作为立即操作数的浮点常量 演员表。整数常量表达式中的强制转换运算符只能 将算术类型转换为整数类型,除非作为 sizeof 运算符的操作数。

和(6.7.6.2 数组声明符)

4 如果不存在大小,则数组类型是不完整类型。如果 大小是 * 而不是表达式,数组类型是 a 未指定大小的变长数组类型,只能使用 在具有函数原型范围的声明或类型名称中;这样的 尽管如此,数组仍然是完整的类型。如果大小是整数 常量表达式和元素类型具有已知的常量大小, 数组类型不是变长数组类型;否则, 数组类型是变长数组类型。 (变长数组 是实现不需要支持的条件功能;看6.10.8.3.)

可变长度数组的声明可以类似于

const int n = 5;
int my_array[sizeof(int) * n];

在 C11 及更高版本中,可变长度数组的支持是可选的。

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

声明中的数组长度可以是非常量吗? 的相关文章

  • 分段错误(核心转储)错误

    我的程序编译罚款 但在输入文件时出现 分段错误 核心转储 错误 我没有正确处理 ostream 吗 include
  • 内联函数/方法

    声明 内联函数必须在调用之前定义 这个说法正确吗 EDIT 该问题最初是德语 内联功能穆森 弗 伊赫雷姆 奥夫鲁夫定义 sein 也许它对任何人都有帮助 是的 它是正确的 但只是部分正确 它可能正确地重新构建如下 内联函数必须在每个翻译单位
  • 在 C# 中生成 HMAC-SHA1

    我正在尝试使用 C 来使用 REST API API 创建者提供了以下用于 hmac 创建的伪代码 var key1 sha1 body var key2 key1 SECRET KEY var key3 sha1 key2 var sig
  • SSL/TLS/HTTPS 站点在 C#/.NET WebBrowser 控件中非常慢,但在 Internet Explorer 中则很好

    背景 我正在修改自动维基浏览器 http en wikipedia org wiki Wikipedia AutoWikiBrowser使用托管在安全服务器上的 MediaWiki 站点 我允许用户通过 C 应用程序中的 WebBrowse
  • 将字符串中的“奇怪”字符转换为罗马字符

    我需要能够将用户输入仅转换为 a z 罗马字符 不区分大小写 所以 我感兴趣的角色只有26个 然而 用户可以输入他们想要的任何 形式 的字符 西班牙语 n 法语 e 和德语 u 都可以包含用户输入中的重音符号 这些重音符号会被程序删除 我已
  • mprotect 之后 malloc 导致分段错误

    在使用 mprotect 保护内存区域后第一次调用 malloc 时 我遇到分段错误 这是执行内存分配和保护的代码片段 define PAGESIZE 4096 void paalloc int size Allocates and ali
  • 如何将带有自定义分配器的 std::vector 传递给需要带有 std::allocator 的函数?

    我正在使用外部库 pcl 因此我需要一个不会更改现有函数原型的解决方案 我正在使用的一个函数生成一个std vector
  • 劫持系统调用

    我正在编写一个内核模块 我需要劫持 包装一些系统调用 我正在暴力破解 sys call table 地址 并使用 cr0 来禁用 启用页面保护 到目前为止一切顺利 一旦完成 我将公开整个代码 因此如果有人愿意 我可以更新这个问题 无论如何
  • 无法解析远程名称 - webclient

    我面临这个错误 The remote name could not be resolved russgates85 001 site1 smarterasp net 当我请求使用 Web 客户端读取 html 内容时 出现错误 下面是我的代
  • 从成员函数指针类型生成函子

    我正在尝试简化 通过make fn 预处理参数的函子的生成 通过wrap 对于 arity 的成员函数n 生成函子基本上可以工作 但到目前为止只能通过显式指定成员函数的参数类型来实现 现在我想从它处理的成员函数类型生成正确的函子 struc
  • C++ 插件的“最适合”动态类型匹配

    我有一个几乎所有东西都是插件的架构 该架构以图形用户界面为基础 其中每个插件都由一个 表面 即用户可以通过其与插件交互的 UI 控件 表示 这些表面也是插件 每当添加新插件时 瘦主机都会自动确定哪个可用表面与其最匹配的 UI 如何在 C 中
  • 预处理后解析 C++ 源文件

    我正在尝试分析c 使用我定制的解析器的文件 写在c 在开始解析之前 我想摆脱所有 define 我希望源文件在预处理后可以编译 所以最好的方法是运行C Preprocessor在文件上 cpp myfile cpp temp cpp or
  • C++ 错误 - “成员初始值设定项表达式列表被视为复合表达式”

    我收到一个我不熟悉的 C 编译器错误 可能是一个非常愚蠢的错误 但我不能完全指出它 Error test cpp 27 error member initializer expression list treated as compound
  • C# 中的常量和只读? [复制]

    这个问题在这里已经有答案了 可能的重复 const 和 readonly 之间有什么区别 https stackoverflow com questions 55984 what is the difference between cons
  • .NET 客户端中 Google 表格中的条件格式请求

    我知道如何在 Google Sheets API 中对值和其他格式进行批量电子表格更新请求 但条件格式似乎有所不同 我已正确设置请求 AddConditionalFormatRuleRequest formatRequest new Add
  • 初始化 LPCTSTR /LPCWSTR [重复]

    这个问题在这里已经有答案了 我很难理解并使其正常工作 基本上归结为我无法成功初始化这种类型的变量 它需要有说的内容7 2E25DC9D 0 USB003 有人可以解释 展示这种类型的正确初始化和类似的值吗 我已查看此站点上的所有帮助 将项目
  • 使用 iTextSharp 5.3.3 和 USB 令牌签署 PDF

    我是 iTextSharp 和 StackOverFlow 的新手 我正在尝试使用外部 USB 令牌在 C 中签署 PDF 我尝试使用从互联网上挖掘的以下代码 Org BouncyCastle X509 X509CertificatePar
  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • 为什么 Linux 对目录使用 getdents() 而不是 read()?

    我浏览 K R C 时注意到 为了读取目录中的条目 他们使用了 while read dp gt fd char dirbuf sizeof dirbuf sizeof dirbuf code Where dirbuf是系统特定的目录结构
  • 以 UTF8 而不是 UTF16 输出 DataTable XML

    我有一个 DataTable 我正在使用 WriteXML 创建一个 XML 文件 尽管我在以 UTF 16 编码导出它时遇到问题 并且似乎没有明显的方法来更改它 我了解 NET 在字符串内部使用 UTF 16 这是正确的吗 然后 我通过

随机推荐

  • 删除 id=".xxx" 的 div 或 span

    我无法删除 id 带有句点或星号的 div div div div div 我有 jquery 代码 它删除了 div div 但不是上面的 不是在寻找 jQuery 代码 但它需要正斜杠吗 来自 anurag 的请求 JavaScript
  • 回调到可变的 self

    有没有一种方法 在 Rust 中 可以将可变的借用自我发送到回调而不需要mem replace我在以下 MWE 中使用的 hack 我正在使用 Rust stable 1 11 0 use std mem trait Actable fn
  • 如何在强制推送基础分支后更新我的功能分支。我们只使用rebase,禁止合并

    我们正在使用 git 中的一个非常简单的结构 首先我们有我们的master branch 下面我们有develop 最后我们可以有任何feature branch 我们仅使用 rebase 来更新分支上的历史记录 然后转发到上述分支 每周
  • 集合编辑器未针对 TPersistent 属性中的 TCollection 属性打开

    我有我的自定义集合属性 当它是我的组件的直接成员时 它工作得很好 但我想将集合属性移动到组件内的 TPersistent 属性 现在问题来了 它不起作用 双击对象检查器中的集合属性通常会打开集合编辑器 但现在不再这样了 首先 我应该将什么传
  • 我的华为手机如何设置这个配置?

    我的问题是 在我的华为手机上 我的服务被终止 所以我需要更改手机上的设置 我的问题与this 注意 华为和小米设备具有邪恶的任务杀手服务 会干扰 Telegram 通知服务 为了让我们的通知发挥作用 您需要将 Telegram 添加到这些设
  • JavaScript 正则表达式将 URL 和电子邮件包装在锚点中

    我四处搜寻 但无法找到明确的答案 正则表达式经常出现这种情况 所以我想我会在这里问 我正在尝试组合一个可以在 JavaScript 中使用的正则表达式 以用指向它们的锚标记替换 URL 和电子邮件地址的所有实例 不需要如此严格 显然 这通常
  • 在“if”子句中使用“in”时是元组还是列表?

    哪种方法更好 使用元组 例如 if number in 1 2 或列表 例如 if number in 1 2 建议将哪一种用于此类用途 为什么 逻辑和性能方面 Python 解释器将第二种形式替换为第一种形式 这是因为从常量加载元组是一项
  • 使用 JQuery 从数组填充表

    我有一个包含 16 个元素的数组 我想将其填充到一个表格中 我希望它有 2 行 每行 8 个单元格 其中填充有数组 我的问题是 当填充表时 表将所有元素填充到一行中 我对 JQuery 没有太多经验 我想尝试让它发挥作用 任何帮助表示赞赏
  • IIS7上可以在html中包含php吗?

    在 Apache 中似乎可以这样做 在 HTML 中包含 php 脚本 但是我可以让 IIS 7 解析 html 文件为 php 吗 目前我的 html 文件允许包含 asp 如果我可以用 php 文件来做到这一点 那就太好了 我的服务器按
  • 使用自定义 java 运行时映像时发生 javax.net.ssl.SSLHandshakeException 但并非没有

    我有这个类 它只发送一个 http post 请求 import java net import java io public class JarRuntimeTest public void start throws Exception
  • BigDecimal、精度和小数位数

    我在应用程序中使用 BigDecimal 来表示数字 例如使用 JPA 我对 精度 和 规模 这两个术语做了一些研究 但我不明白它们到底是什么 谁能解释一下 BigDecimal 值的 精度 和 小数位数 的含义 Column precis
  • 将单个对象插入 json 文件而不重写整个文件

    我正在研究一种使用 JSON NET 将马对象添加到 JSON 格式的马数据库中的方法 一种选择是将整个文件反序列化为马列表 添加新马 然后序列化该列表并重写整个文件 我在下面的代码中实现了这种方法 adds a horse to the
  • row.names() 和 attribute$row.names 有什么区别?

    row names iris 返回一个字符向量 gt row names head iris 1 1 2 3 4 5 6 and attributes iris row names返回一个整数向量 gt attributes head ir
  • 如何在 protobuf-net 中启用字符串驻留?

    我使用的是 v2 rev 421 当我保存 protobuf net 生成的流并将其放入字符串实用程序时 它发现了许多重复的字符串 我说的是应用程序生成的字符串 它可以被实习 但默认情况下字符串实习似乎没有打开 我如何启用它 Thanks
  • AngularJS:旧 Angular 版本中的 $q.race()

    Angular 1 5 8 实现了 q race 方法 它接受一个 Promise 数组并返回一个 Promise 该 Promise 使用第一个已解析 Promise 的值进行解析 然而我现在坚持使用 Angular 1 4 并且需要某种
  • 计算给定速度的轨道截距。

    背景 尝试编写一款 FTL 旅行不受重力影响并且加速度是即时的游戏 给定行星的开普勒轨道和飞船的当前位置及其最大超光速 FTL 速度 如何计算行星的位置 单位 米 秒 我可以获取给定日期时间的行星位置 但我正在努力弄清楚如何计算行星的位置以
  • 在“公共”文件夹中使用索引进行 URL 重写

    我是开发领域的新人 我拼命地想获得好的网址 我检查了该网站是否有类似问题 但找不到我需要的东西 或者我做得不好 情况如下 我为一个站点设置了一个项目 该站点的 index php 文件位于名为 Public 的文件夹中 更清楚地说 这是我现
  • Java 支持哪个版本的 ZIP(1.6 - 或任何与此相关的版本)

    ZIP 格式有多个版本 http en wikipedia org wiki ZIP 28file format 29 Version history 目前还不清楚 Java 支持哪个版本 在源代码中ZipOutputStream它定义了一
  • Python 使用 re 在字符之间创建空格(方括号中的字符除外)

    我有一个数据框 d1 letters ABCDE NOT FGH CCGF NOT HI MPJ NOT L MNA NOT PLJKAJSHD df1 pd DataFrame d1 df1 letters 0 ABCDE NOT FGH
  • 声明中的数组长度可以是非常量吗?

    我对 C 中的数组声明有点困惑 我知道可以这样做 int a 20 Reserved space for 20 int array int b 32 431 10 42 Length in square brackets is auto c