固定大小缓冲区不能直接从“this”对象使用

2024-01-11

我使用结构来表示纯数据。其中一个字段是固定大小的缓冲区,如下所示。

[StructLayout(LayoutKind.Sequential, Pack=2)]
unsafe struct ImageDosHeader
{
    ...
    private fixed ushort _e_res[4];
    ...

    [Description("Reserved")]
    [DisplayName("e_res[0]")]
    public ushort e_res_0 { get { ... } set { ... } }

    ...
}

在 get/set 函数中,我尝试执行以下操作,但收到“编译器错误 CS1666:您不能使用未固定表达式中包含的固定大小缓冲区。尝试使用固定语句。”

return this._e_res[0];

然而,以下工作:

fixed (ImageDosHeader* p = &this)
    return p->_e_res[0];

ImageDosHeader local = this;
return local._e_res[0];

我可以轻松使用这些解决方法,但是,我想知道为什么直接访问固定大小的缓冲区是非法的。或者这是我应该报告的错误?

我正在使用.NET 2.0。


这是因为底层的 IL 指令。

该程序执行以下指令序列来获取您想要的元素:

  1. 将地址加载到堆栈上。

  2. 将偏移量加载到堆栈上。

  3. 添加它们。

  4. 读取该内存地址处的值。

如果该对象位于堆中,然后在步骤 4 之前由于垃圾回收而移动,则从步骤 1 加载的地址将不再有效。为了防止这种情况,您需要首先将对象固定到内存中。

(事实上​​,您正在通过this指针意味着您不知道该结构是在堆上还是在堆栈上,因此您必须固定它以防万一它在堆上。)

第二个例子之所以有效,是因为它copies的结构stack,因此副本永远不会移动,因此地址将始终有效。

为什么其他类型的字段不会出现同样的问题?因为它们的偏移已知为编译时,而数组索引已知为run-time,因此 JIT 可以生成始终正确访问字段的代码。

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

固定大小缓冲区不能直接从“this”对象使用 的相关文章

  • 在 LINQ 查询中返回不带时间的日期

    我正在编写一个查询 我想计算按日期联系我们的呼叫中心的次数 看起来很简单 但由于联系日期字段是日期时间字段 我得到了时间 因此当我按联系日期 时间 分组时 每个联系日期实例的计数为 1 所以 我想只按日期分组 而不按时间分组 下面是我用来查
  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • 不带任何特殊字符的 10 位数字的正则表达式

    10 位数字的正则表达式是什么 无特殊字符且无小数 使用此正则表达式仅匹配十位数字 d 10 要查找字符串中任意位置的十个连续数字的序列 请使用 d 10 请注意 这还将查找 11 位数字的前 10 位数字 在字符串中的任意位置搜索exac
  • 当您没有对容器的引用时,是否可以让温莎城堡解决属性依赖关系?

    我们有一个包含多个项目的解决方案 代表我们应用程序的各个层 例如 Domain Data Logic WebUI 我们的温莎城堡容器是从我们的 Web 层引用的 然后我们通过我们的层将这些依赖项级联起来 例如 In Domain publi
  • jquery 插件语法包装器

    这到底是做什么的 我知道它被 jquery 插件包围 但并没有真正理解它的作用 function undefined Plugin goes here jQuery 是一种在 javascript 中运行一段代码的方法 第一对括号是代码部分
  • php 在实例中设置匿名函数

    我刚刚开始使用 PHP 我想知道是否有一种方法可以将匿名函数添加到类实例中 例如 可以说 class A public B c new A This is where I am getting a little confused The f
  • PySpark:从数据帧创建字典的字典?

    我有以下格式的数据 这些数据是从 Hive 获取到数据帧中的 date stock price 1388534400 GOOG 50 1388534400 FB 60 1388534400 MSFT 55 1388620800 GOOG 5
  • 如何在Windows中使用批处理文件删除包含特定字符串的文件?

    我的松下相机使用其愚蠢的 PHOTOfunSTUDIO 来导入照片 它按照片拍摄日期的名称创建文件夹 并将照片分别导入到这些文件夹中 到目前为止 一切都很好 但是 如果我在从相机中删除所有旧照片之前再次导入 则无论我如何更改该软件的设置 旧
  • 将 Docker 容器与 Mesos/Marathon 链接

    到目前为止 我使用 Mesos Marathon 和 Docker 来管理服务器群以及放置在服务器上的容器 取得了巨大成功 然而 我现在想更进一步 开始做一些事情 比如自动将 haproxy 容器链接到每个启动的主 docker 服务 或者
  • SQL Server 2012 CTE 查找分层数据的根或顶层父级

    我在尝试递归地遍历层次结构以查找组织结构中可能具有的所有后代节点的顶部节点时遇到问题multiple顶级节点 我正在尝试使用 SQL Server 2012 CTE 来执行此操作 但它不会递归到达每个分支的最顶层节点 我已经尝试完全按照与此
  • 我的 Web api 2 控制器需要路由

    我有一个返回 XML 的简单 WebApi2 控制器 但我无法使用我定义的路由正确添加另一个方法 namespace CBMI WebAPIservice Controllers public class MarkersController
  • 使用 QWebEngine 渲染图像

    我正在寻找替换QWebKit with QWebEngine在我的无头渲染器中 我初始化页面load 并将一个插槽连接到loadFinished 生成最终的 PNG 图像 这曾经工作得很好WebKit但失败了QWebEngine 代码如下
  • 在 Jekyll 上的 CSS 中使用 Liquid 诱惑来调整每页的 div 背景颜色

    我正在使用 Jekyll 和 Liquidwebsite http annawees github io 我一直坚持在 CSS 中使用 Liquid 来正确编译 我尝试为每个页面的边框使用不同的颜色 并将默认设置为黑色 我很欣赏你们的任何见
  • RealmList序列化问题(Realm/Gson/Intent)

    我在项目中使用了 Retrofit Gson 和 Realm 我有这门课Example需要是Serializable 如果没有 Realm 我会这样写 public class Example implements Serializable
  • HttpWebRequest 底层连接已关闭

    我在用HttpWebRequest to POST通过网络服务的字节数组图片 图片大小类似于byte 4096 Code HttpWebRequest webRequest HttpWebRequest WebRequest Create
  • 从 JNI 调用函数指针

    我已经在 cpp 中用原型实现了一个函数 MyFunction int size int 回调 UINT16 arg1 UINT16 arg2 第二个参数是一个函数指针 必须在java中实现 我怎样才能实现该功能 另外我如何在 JNI 中调
  • 关于使用 Async 和 Await C# 进行异步编程的问题[重复]

    这个问题在这里已经有答案了 我正在学习如何使用 Async 和 Await C 所以我得到了一个链接http msdn microsoft com en us library vstudio hh191443 aspx BKMK WhatH
  • 将 Rcpp 函数扩展到任何类型的输入向量

    我有以下函数 它执行一个简单的循环NumericVector并返回int类型值 Rcpp cppFunction int calc streak NumericVector x int i1 int i2 int cur streak 1
  • 在 matplotlib 中向 3d 箭袋图添加颜色

    我想要在 3d 箭袋图中具有与颜色图相对应的颜色 绘图的 2d 版本有一个可选数组 用于将颜色映射到箭头 如何在 3d 版本中创建相同的效果 3D 箭袋图是 1 4 中的一个全新功能 它 及其文档 可能仍然有点粗糙 在这种情况下 我们可以尝
  • 将字符串列表转换为排序的映射字符串长度作为键

    我有一个List
  • 动画汉堡导航

    我正在为我的网站创建一个完整的页面导航阴影 以便它在所有设备上都相同 目前我有两个按钮 一个用于当阴影在视野中时 一个用于当阴影不在视野中时 我想知道是否让一个按钮始终存在以便可以动画化会更好 我的目标是像squeeze动画片here ht
  • 固定大小缓冲区不能直接从“this”对象使用

    我使用结构来表示纯数据 其中一个字段是固定大小的缓冲区 如下所示 StructLayout LayoutKind Sequential Pack 2 unsafe struct ImageDosHeader private fixed us