C++ - 类函数内数组的长度[重复]

2024-02-22

我知道有几个线程问类似的问题,但我找不到解决方案,而且我对 C++ 有点陌生。

我想计算 DWORD 数组的长度。所以它只是一个无符号长整型。

DWORD offsets[] = {0x378, 0x14, 0x0};

这是我的函数的标头定义:

DWORD allocateAddress(DWORD, DWORD[]);

这是cpp函数内部:

DWORD Window::allocateAddress(DWORD baseAddress, DWORD offsets[])
{
    DWORD buffer;
    DWORD pointer;

    int level = 3; // Length of offset array should be calculated here.

    for (int c = 0; c < level; c++)
    {
        if (c == 0)
        {
            buffer = this->read(baseAddress); 
        }

        pointer = buffer + offsets[c];
        buffer = this->read(pointer);
    }

    return pointer;
}

这就是我计算长度的方法:

sizeof(offset) / sizeof(*offset) // or sizeof(offset[0])

如果我在 allocateAddress 函数中这样做,我只会得到 4 个字节。在 main 方法中测试它返回 12 个字节,这是我想要的值。

std::cout << sizeof(Address::offset) << std::endl;

为什么我得到一维 DWORD 的大小? =(


这是因为 C/C++ 不会将数组的长度保存在内存中的任何位置。

“offsets”参数被声明为未定义长度的数组。这当然是正确的,因为您想支持任何数组,但这意味着无法在运行时知道数组的大小。

这样想:“sizeof”关键字返回基于仅声明变量而不是运行时的实际大小。

如果你的变量是这样声明的:

DWORD offsets[3]

那么它的类型是“3 个 DWORD 的数组”(DWORD[3]),因此 sizeof 将返回“3 个 DWORD 数组”的字节大小或 12 个字节。在您的情况下,数组的大小隐式定义为DWORD[3]因为你用三个值初始化它。

但是如果你将一个参数声明为:

DWORD offsets[]

它的类型变成“未知长度的数组”(或DWORD[])。由于这在功能上与常量指针相同,因此“sizeof”将表现得好像有一个元素一样。因此“sizeof”返回 1 * sizeof(DWORD) = 4。

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

C++ - 类函数内数组的长度[重复] 的相关文章

  • 适合初学者的良好调试器教程[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有谁知道一个好的初学者教程 在 C 中使用调试器 我感觉自己好像错过了很多 我知道怎么做 单步执行代码并查看局部变量 虽然这常常给我带来问
  • 如何在C(Linux)中的while循环中准确地睡眠?

    在 C 代码 Linux 操作系统 中 我需要在 while 循环内准确地休眠 比如说 10000 微秒 1000 次 我尝试过usleep nanosleep select pselect和其他一些方法 但没有成功 一旦大约 50 次 它
  • 使用正则表达式搜索 Ruby 数组

    你好 我有一个小的 ruby 函数 它可以分割出一个 Ruby 数组 如下所示 def rearrange arr from to sidx arr index from eidx arr index to arr sidx arr sid
  • 为什么在 WebApi 上下文中在 using 块中使用 HttpClient 是错误的?

    那么 问题是为什么在 using 块中使用 HttpClient 是错误的 但在 WebApi 上下文中呢 我一直在读这篇文章不要阻止异步代码 https blog stephencleary com 2012 07 dont block
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • 从客户端访问 DomainService 中的自定义对象

    我正在使用域服务从 Silverlight 客户端的数据库中获取数据 在DomainService1 cs中 我添加了以下内容 EnableClientAccess public class Product public int produ
  • unordered_map 中字符串的 C++ 哈希函数

    看起来 C 标准库中没有字符串的哈希函数 这是真的 在任何 c 编译器上使用字符串作为 unordered map 中的键的工作示例是什么 C STL提供模板专业化 http en cppreference com w cpp string
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • 如何在 C 中安全地声明 16 位字符串文字?

    我知道已经有一个标准方法 前缀为L wchar t test literal L Test 问题是wchar t不保证是16位 但是对于我的项目 我需要16位wchar t 我还想避免通过的要求 fshort wchar 那么 C 不是 C
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • 等待 IAsyncResult 函数直至完成

    我需要创建等待 IAsyncResult 方法完成的机制 我怎样才能做到这一点 IAsyncResult result contactGroupServices BeginDeleteContact contactToRemove Uri
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • 打印大型 WPF 用户控件

    我有一个巨大的数据 我想使用 WPF 打印 我发现WPF提供了一个PrintDialog PrintVisual用于打印派生的任何 WPF 控件的方法Visual class PrintVisual只会打印一页 因此我需要缩放控件以适合页面
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • 在 Windows Phone silverlight 8.1 上接收 WNS 推送通知

    我有 Windows Phone 8 1 silverlight 应用程序 我想使用新框架 WNS 接收通知 我在 package appxmanifest 中有
  • 可访问性不一致:参数类型的可访问性低于方法

    我试图在两个表单之间传递一个对象 基本上是对当前登录用户的引用 目前 我在登录表单中有一些类似的内容 private ACTInterface oActInterface public void button1 Click object s
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File
  • 如何使用 C++11 using 语法键入定义函数指针?

    我想写这个 typedef void FunctionPtr using using 我该怎么做呢 它具有类似的语法 只不过您从指针中删除了标识符 using FunctionPtr void 这是一个Example http ideone

随机推荐

  • 使用PL/SQL删除大量记录

    我想使用PL SQL删除大量记录 这些记录由 DATE 字段标识 该字段标识上次修改记录的时间 我不想消耗太多资源 因此我认为应该限制要删除的记录数量 在我看来 伪列 ROWNUM 可以满足此目的 然后 我检查受更新影响的行数并重复 直到影
  • 是否可以对 Websocket 升级请求使用承载身份验证?

    打开WebSocket连接的升级请求是标准的HTTP请求 在服务器端 我可以像其他任何请求一样验证请求 就我而言 我想使用承载身份验证 不幸的是 在浏览器中打开 Websocket 连接时无法指定标头 这会让我相信不可能使用承载身份验证来验
  • 使用 sleep 和 wait -n 在 bash 中实现简单的超时,是否存在竞争条件?

    如果我在 bash 脚本中执行此操作 sleep 10 sleep pid some command wait n cmd pid if kill 0 sleep pid 2 gt dev null then all ok kill sle
  • 如何等待 ThreadPoolExecutor 中的所有任务完成而不关闭 Executor?

    我不能使用shutdown and awaitTermination 因为在等待时 新任务可能会被添加到 ThreadPoolExecutor 中 因此 我正在寻找一种方法来等待 ThreadPoolExecutor 清空其队列并完成所有任
  • 如何使用BetterAuthorizationSample? - 可可

    我正在尝试使用 BetterAuthorizationSample 而不是采用所谓的 恶意 方式使用 setuid 来获取 root 权限 目前我正在使用 AuthorizationCreate 使用 BLAuthentication 获得
  • 使用 docker 和主机文件

    我正在尝试让 hbase 容器运行 并且该容器需要一些stuff这意味着 docker 主机需要作为 docker 可用 我们通过使用 docker 在主机文件中设置 docker ip 来实现这一点 但是 当我运行时 docker ps
  • 获取当前语言 next-i18next

    我将 NextJS 与 next i18next 一起使用 这是我的主页 import withTranslation from config next i18next const Home function Home return div
  • 尝试在 google chrome 中使用 HTML5 文件 api 时出现 FileError

    我试图使用 chrome 中的文件系统 API 创建一个文件 最初我尝试了如下持久存储 window requestFileSystem window requestFileSystem window webkitRequestFileSy
  • 使用 distplot 绘制直方图时 y 轴的单位是什么?

    使用 distplot 绘制直方图时 y 轴的单位是什么 我用正常拟合绘制了不同的直方图 我发现在一种情况下 它的范围是 0 到 0 9 而在另一种情况下 它的范围是 0 到 4 5 From help sns distplot norm
  • 为什么函数调用称为“函数调用”?

    我知道什么是函数调用 我知道它的作用 我已经调试了很多了 我有some凭直觉理解为什么使用术语 函数调用 是有意义的 但归根结底 我无法像使用 函数调用 那样正确解释这一点return陈述 例如 用return陈述答案是 叫做 回归 因为你
  • 如何通过“合并前需要拉取请求审查”来保护分支

    我已将其发布在 github community 上 但尚未得出任何解决方案 我试图保护主分支免受单人直接推送的影响 每个更改都必须通过 功能 分支进行 然后通过拉取请求得到另一个 或特定 开发人员的批准 在存储库的设置中 此功能似乎可以执
  • tf.data.Iterator.get_next():如何在tf.while_loop中前进?

    目前 我尝试在 Tensorflow while 循环中实现所有训练 但我在使用 Tensorflow 数据集 API 的迭代器时遇到了问题 通常 当调用 sess run 时 Iterator get next 前进到下一个元素 但是 我
  • 使用 Dozer 的自定义转换器将对象列表映射到另一个列表

    我想做的是使用 Dozer 将实体列表映射到它们的字符串 ID 列表 或多或少 显然 它意味着自定义转换器 我的第一个想法是创建一个从 MyEntity 到 String 的转换器 然后对 Dozer 说 使用此转换器映射此集合的每个对象
  • 获取 foreach 中先前的数组值

    我的数组 arr array jan feb mar apr mei jun jul agu sep okt nov des 然后我做了一个 foreach foreach arr as ar echo ar 这会将 jan 输出到 des
  • Oracle 中的并发更新:锁定与否?

    我很困惑 我正在阅读有关 Oracle 中的 MVCC 的内容 我以为MVCC意味着没有锁 但是 我在其他地方读到这一切UPDATE无论隔离级别如何 都会执行自动锁定 有人可以解释一下 Oracle 更新期间会发生什么吗 当多个已提交读事务
  • Mfc CComboBoxEx - 如何更改背景颜色

    我有一个派生自 CComboBoxEx 的类 我正在尝试更改背景颜色 我认为它会像 ComboBox 一样工作 使用 SetBkColor 函数 但它不会改变背景颜色 这是我尝试过的 BEGIN MESSAGE MAP CMyComboBo
  • svn:转储格式文档?

    svnadmin dump 格式是否记录在某处 我想记录一个包含 svn 存储库所有元数据的数据结构 除了文件内容本身之外 它基本上与 转储 文件中的内容相同 似乎 svnkit 库会有它 或者有办法以编程方式获取此元数据 但我在过去的一个
  • 单击引导按钮显示默认颜色

    我正在尝试使用下面的代码设置按钮颜色的样式 颜色在我单击按钮之前一直有效 按钮显示默认颜色 如何指定按钮 onclick 的颜色 btn success color ffffff background color 161617 border
  • 当目标是对象时,JSON.net 将 json 数组序列化为 JArray。我怎样才能改变这一点?

    我有一个单级 json 我想将其反序列化为Dictionary
  • C++ - 类函数内数组的长度[重复]

    这个问题在这里已经有答案了 我知道有几个线程问类似的问题 但我找不到解决方案 而且我对 C 有点陌生 我想计算 DWORD 数组的长度 所以它只是一个无符号长整型 DWORD offsets 0x378 0x14 0x0 这是我的函数的标头