可变长度数组类型的 Sizeof 运算符

2024-01-18

根据参考参数 http://en.cppreference.com/w/c/language/sizeof:

如果类型为表达 is a 变长数组 type, 表达被评估并计算其求值的数组的大小 在运行时。

这意味着:如果类型表达是一个VLA类型,那么表达被评估。例如:

#include <stdio.h>

int main() {
    int i = 0;
    int a[i];
    printf("%zu\n",sizeof(a[i++]));
    printf("%d\n",i); // Here, print 0 instead of 1
    return 0;
}

所以,根据参考资料,这里i变成1。但是,使用我的 GCC 编译器,i打印为0.

See 魔盒演示 https://wandbox.org/permlink/u15UOXihrmkO2Ct6.


首先,请注意数组的大小不能为零,无论是否为 VLA。所以你的代码会调用未定义的行为。

C11 6.7.6.2/5

“如果大小是一个不是整数常量表达式的表达式:” /--/ “...每次计算时,它的值都应大于零。”


至于实际问题,a[i++]属于类型int,不是 VLA 类型。

为了获得副作用,必须涉及VLA数组类型本身,例如sizeof(a)。只有这样,才会评估操作数的副作用。举一个例子来说明这一点:

#include <stdio.h>

int main() {
    int i=1, j=1;
    int a[i][j];
    int b[1][1];

    (void) sizeof(a[--i]);
    (void) sizeof(b[--j]);
    printf("%d %d", i, j);

    return 0;
}

Here i从第一次开始最终为 0sizeof由于VLA而被评估,但是j仍为 1,因为--j是一个的一部分sizeof对于常规数组。

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

可变长度数组类型的 Sizeof 运算符 的相关文章

  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK

随机推荐

  • jQuery - 检查元素是否进入视图,淡入那些可见的元素

    当我知道要指定哪个元素时 我找到了这个问题的答案 但我正在寻找一种方法来检查 滚动 是否具有特定类的任何元素已进入视图 并按它们的方式修改它们 例如 更改不透明度 仅更改那些可见的透明度 我知道代码可能看起来与此类似 但我无法使其工作 jQ
  • Perl 特殊变量“@_”在子例程中不起作用

    该脚本从下载的网页中提取 URL 我在使用这个脚本时遇到了一些问题 当我使用 my csv html line 然后打印出 html LineArray 它只是打印出来 1 s 当我更换 my csv html line with my c
  • 传递引用类型对象并更改值

    我正在尝试将引用类型对象传递到方法中并从那里更改它 当我更改它时 传递给方法的变量没有更改 这是示例 public interface IPerson string Name get public class Teacher IPerson
  • Android Studio“构建”选项卡没有指向文件和行的链接?

    如何启用它以便每个编译时错误都带有指向文件和行的链接 我的同事也是这样 在我的 IDE 上似乎有些东西被禁用了 我找不到什么和在哪里 帮助 None
  • PyCharm 中针对 Python 编译扩展的自动完成

    当使用编译扩展 例如 OpenCV Python 绑定 编写 Python 代码时 PyCharm 似乎不知道它们的可用性 导入标有灰色下划线 作为工具提示显示 未解析的引用 并且自动完成功能也不起作用 代码中已使用的函数名称除外 这不是由
  • 使用 TreeView 最小化 ViewState

    关于如何做到这一点有任何实用的提示 技巧吗 似乎没有很多关于如何做到这一点的信息 我正在将数据从数据库加载到 TreeView 中 最大节点数约为 100 我仍然对最小化 ViewState 感兴趣 我还将动态添加和删除节点 通过用户交互
  • MSQLSMS 中蓝色和粉色单词的含义

    Microsoft SQL Management Studio 突出显示了一些特殊单词 并用蓝色或粉红色将它们着色 我想知道哪个规则决定了要使用的颜色 例如 考虑以下两个语句 SELECT FROM myTable UPDATE myTab
  • 由于某种原因无法从 p 标签获取文本 - Selenium (Python)

    我正在尝试用 Selenium 抓取页面 示例 HTML 如下所示 来自查看页面源代码 div class col s12 m12 l4 xl4 therapist contact list p class col s6 m6 l6 xl6
  • 停止 jquery 循环插件

    我正在使用cycle jquery 插件 我有一些淡入淡出的图像 希望它在循环结束时停止在最后一张图像上 有谁知道一个好方法来做到这一点 谢谢
  • ASCII 到光栅的转换

    我正在使用以下代码打开单波段光栅图像 带有温度值 library raster nrows 764 ncols 1022 df1 lt read table AA092800 1 asc skip 11 header FALSE sep t
  • Flask 静态文件路由中的变量 [url_for('static', filename='')] [重复]

    这个问题在这里已经有答案了 我正在制作一个简单的音乐应用程序 我想允许用户上传他们的音频文件 并且我有一个页面 我计划在其中显示所有歌曲 我创建了一个模板 结构如下 for song in songs div class chart ite
  • 使用自定义日期初始化 NSDate

    我正在寻找类似的东西 NSDate date NSDate alloc initWithYear 1984 month 10 Day 8 有没有办法做这样的事情 Thanks 我为此任务编写了一个类别 NSDate 缺少很多有用的方法 in
  • android 中如何检测用户存在?

    我知道在 Galaxy Samsung SIII 中可以在设置中配置一个选项 以避免用户在查看屏幕时屏幕关闭 我认为手机使用摄像头或某种存在传感器 是否可以通过编程来完成 即使可以 某些设备也无法做到这一点 我在这里想象一些可能性 使用相机
  • 如何自动更新使用 Inno Setup 安装的应用程序

    我有一个适用于 Windows 的可执行应用程序 setup exe 是我使用基于 Java 的 Launch4j Inno Setup 实现的 我经常频繁发布新版本和错误修复 我想知道是否有自动安装更新的机制 Inno Setup 没有任
  • 主机名的有效字符?

    主机名的有效字符是什么 这类似于联网计算机或网络域 具体来说 我正在编写一个连接到远程服务器的 PC 游戏 所以我有一个主机名字段和一个端口字段 显然 端口是短范围内的数字 但我需要知道所有可能的主机名字符是什么 以及可能需要的任何其他模式
  • DocumentDB REST API - 授权令牌错误

    Problem 每当我们请求列表或查询时 我们都会看到从 DocumentDB REST API 返回此错误 但当我们按名称 ID 获取对象时则不会 输入的授权令牌无法满足请求 请检查预期的有效负载是否按照协议构建 并检查正在使用的密钥 背
  • 使用 PLSQL 发送电子邮件

    我想使用 PL SQL 通过 gmail 或 yahoo 主机发送电子邮件 我在 google 中搜索并找到 SMT Mail 包 但它对我不起作用 请问有人可以指导我如何实现这一目标吗 CREATE OR REPLACE PROCEDUR
  • IE 10 和 11 使固定背景在使用鼠标滚轮滚动时跳跃

    当您在 Windows 8 中滚动鼠标滚轮时 固定的背景图像会疯狂地弹跳 这仅影响 IE 10 和 IE 11 这会影响以下元素position fixed以及 这是一个具有固定背景图像的示例 http www catcubed com t
  • Celery 任务优先级

    我想使用 Celery 管理任务 我想要一个任务队列 并发性为1 并且能够将任务推送到具有不同优先级的队列中 这样优先级较高的任务将抢占其他任务 我将三个任务添加到队列中 如下所示 添加任务 py from tasks import exa
  • 可变长度数组类型的 Sizeof 运算符

    根据参考参数 http en cppreference com w c language sizeof 如果类型为表达 is a 变长数组 type 表达被评估并计算其求值的数组的大小 在运行时 这意味着 如果类型表达是一个VLA类型 那么