如何获取 UnsafeMutableRawPointer 的值?

2024-04-04

我试图获取 UnsafeMutableRawPointer 指向的地址,但我无法这样做。我也是 Swift 新手,所以我可能会遗漏一些东西或者做得完全错误。我最好将原始值转换为 CChar。


路人注意:我的大部分回答没有意义,因为它没有回答上面的最初问题,而是回答了中出现的问题chat https://chat.stackoverflow.com/rooms/127974/discussion-between-alexander-momchliov-and-jack-sexton与OP。

我花了几个小时,但现在我已经学会了一些汇编,我可以回答一些问题。

  1. CChar is a C Char... 字面上地。它代表的是char类型C。它是typealias to Int8。它是一个字节。您不能像指针类型一样使用它,因为它们是 8 个字节(在 64 位机器上)。

  2. 你不需要这一切UnsafeMutableRawPointer样板,和你当然不需要访问其原始值。您可以在需要指针的地方直接传递数组。

    当函数被声明为采用 UnsafePointer 参数时,它可以接受以下任何一个:...

    • 一个 [Type] 值,作为指向数组开头的指针传递。

    from 与 C API 交互 - 指针 https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html#//apple_ref/doc/uid/TP40014216-CH8-ID23.

  3. 您遇到的问题是您的突变0x8(%rdi)似乎并没有体现在Swift方面。这里的问题是你正在以 8 个字节的偏移量写入,但随后print(a.load(as: void_star.self))正在读取第一个字节。您正在读取一个从未修改过的字节。

我做了一些进一步的探索。这是我冒险的战利品:

示例Swift.swift:

@_silgen_name("incrementByValue")
    func incrementByValue(_: Int64)

@_silgen_name("incrementByReference")
    func incrementByReference(_: inout Int64)

@_silgen_name("return1234")
    func return1234() -> Int64

@_silgen_name("incrementElements")
    func incrementElements(of _: UnsafeRawPointer, count _: Int)

var a: Int64 = 100
print("\"a\" before \"incrementByValue(a)\": \(a)")
incrementByValue(a)
print("\"a\" after \"incrementByValue(a)\": \(a)\n")

var b: Int64 = 200
print("\"b\" before \"incrementByValue(b)\": \(b)")
incrementByReference(&b)
print("\"b\" after \"incrementByValue(b)\": \(b)\n")

print("return1234() returned: \(return1234())\n")

var array: [Int64] = Array(0...5)

print("\"array\" before incrementElements(of: array, count: array.count): \n\t\(array)")
incrementElements(of: array, count: array.count)
print("\"array\" after incrementElements(of: array, count: array.count): \n\t\(array)\n")

示例ASM.s:

.text

.globl _incrementByValue
.globl _incrementByReference
.globl _return1234
.globl _incrementElements

// A test routine that demonstrates operating on a value
_incrementByValue:
    // %rdi contains a copy of the argument passed in.
    // Changes here won't be reflected back in Swift
    incq %rdi
    ret

// A test routine that demonstrates operating on a reference
_incrementByReference:
    // %rdi contains a reference tp the argument passed in.
    // Changes to the reference itself won't be reflected back in Swift,
    // but changes to the referenced memory will.
    incq (%rdi)
    ret

// A test routine that demonstrates the use of %rax for returning a value
_return1234:
    movq $1234, %rax    // return value is in rax
    ret

//A test routine that demonstrates operating on an array
_incrementElements:
    // %rdi: Pointer to first of n Int64 elements
    // %rsi: the array count, n

    movq    %rsi, %rcx  // Set loop counter (%rcx) to n
    aLoop:
        incq    (%rdi)      // increment value pointer to by %rdi
        add     $8, %rdi    // advance pointer by 8 bytes
        loop    aLoop       // loop back to aLoop if rcx > 0

    ret

编译、链接并运行:

llvm-g++ -c exampleASM.s &&
swiftc -c exampleSwift.swift &&
ld exampleASM.o exampleSwift.o -o exampleBinary -force_load /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_macosx.a -framework CoreFoundation -macosx_version_min 10.12.0 -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk -lobjc -lSystem -arch x86_64 -L /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx -rpath /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx -no_objc_category_merging &&
./exampleBinary

Output:

"a" before "incrementByValue(a)": 100
"a" after "incrementByValue(a)": 100

"b" before "incrementByValue(b)": 200
"b" after "incrementByValue(b)": 201

return1234() returned: 1234

"array" before incrementElements(of: array, count: array.count): 
    [0, 1, 2, 3, 4, 5]
"array" after incrementElements(of: array, count: array.count): 
    [1, 2, 3, 4, 5, 6]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获取 UnsafeMutableRawPointer 的值? 的相关文章

  • 在 iOS 上使用 Web 服务的最佳方式?

    我想构建一个 iOS 应用程序 让您登录到网络服务 之后 应用程序将 当用户选择时 通过 https 发送登录名 密码以及请求的变量 例如 在请求 新闻更新 后 它将收到 XML 格式的请求信息 类似于
  • 在 IOS 上使用 AVComposition 混合两个音频文件

    我正在尝试混合两个音频文件 将一个音频文件放在另一个音频文件之上 不是缝合在一起 但我在 IOS 上学习 AVFoundation 时遇到了困难 我在这里遵循了这个答案 如何使用 AVMutableCompositionTrack 合并音频
  • 适用于 IOS 和 Android 的支付网关 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在开发一个应用程序 用户必须在澳大利亚餐馆通过应用程序 android ios 付款 有两种付款方式 通过 PayPal 或 Visa
  • 检测 AVAudioPlayer 中的播放结束

    我有几个短的 mp3 声音 我将它们存储在数组中 并希望连续播放它们 有什么方法可以检测 AVAudioPlayer 何时停止播放 以便我可以调用完成处理程序并播放下一个声音 我知道有一个委托 但我正在使用 Playground 和 SKS
  • 在带有 Storyboard 的 XCode 4 中以模态方式推送视图时,出现“对开始/结束外观转换的不平衡调用”警告

    在网上进行了一些研究但没有成功后 我来这里向您询问有关我的警告的问题 实际上 我有一个带有导航控制器的视图 V1 我想在 V1 完成加载时推送模态视图 V2 所以我用performSegueWithIdentifier方法 我正在使用故事板
  • 如何将字符串日期转换为 NSDate?

    我想转换字符串 2014 07 15 06 55 14 198000 00 00 to an NSDate在斯威夫特 尝试这个 let dateFormatter NSDateFormatter dateFormatter dateForm
  • 如何在 iOS 中更改部分透明图像的颜色?

    我有一个具有部分透明度的单色图像 我有正常版本和 2X 版本的图像 我希望能够用代码将图像着色为不同的颜色 下面的代码适用于普通图像 但 2X 最终会出现伪影 正常图像可能有类似的问题如果是这样 由于分辨率的原因我无法检测到它 UIImag
  • 为什么这个谓词格式会变成 '= nil'

    有人建议这个线程 https stackoverflow com questions 40686005 nspredicate crash after swift 3 migration与我的问题完全相同 但是 我的应用程序没有崩溃 并且我
  • 如何恢复消耗品应用内购买?

    我正在开发一款 iOS 游戏 用户可以通过应用内消耗品购买一定数量的内部货币 比如 1000 金币 如果用户想将余额从一台设备转移到另一台设备 如何恢复消耗品购买 在苹果的文档中 它说我们必须使用我们自己的服务器 但是如何获取用户的Appl
  • 错误:更改核心数据模型后架构armv7的重复符号

    我有一个使用核心数据框架的应用程序 我工作得很好 我刚刚更改了数据模型 向一个实体添加一个属性 当我尝试构建它时 出现错误 duplicate symbol OBJC METACLASS AccountFolder in Users XXX
  • Xcode 中的 iOS 9 警告 - 此文件设置为针对早于项目部署的版本进行构建。功能可能有限

    我刚刚将我的 Mac 更新到最新的操作系统 并将 Xcode 更新到最新版本 现在我收到此警告 但我不知道该由谁来删除它 也不知道它的真正含义是什么 有人可以向我解释一下吗 Thanks Select Main storyboard in
  • 个人帐户开发者之间的 Apple 开发/分发证书

    我一直在到处寻找有关处理证书的正确答案 想象一下以下帐户 Joe拥有个人 Apple 帐户 但他根本不会编码 他只是发布了该应用程序并将其称为自己的 Bob还有一个个人 Apple 帐户 Bob 是一位编码专家 Joe 付费让他开发他的第一
  • UICollectionView 拖放文件夹创建

    我正在使用 UICollectionView 创建 iOS 画廊应用程序 我希望用户能够拖放图像来重新排序图库并创建文件夹 类似于 iPhone 上的主屏幕 我发现了以下内容tutorial http nshint io blog 2015
  • 致命错误:在字典中发现“地理编码地标”类型的重复键。 (Mapbox 地理编码器)

    我引用 这通常意味着要么该类型违反了 Hashable 的要求 要么此类字典的成员在插入后发生了变化 我正在使用 Mapbox Geocoder 当发生此运行时错误时 我的 XCode 将我带到线程 1 0 swift runtime on
  • WhatsApp 显示警告“此项目无法共享。请选择其他项目。”对于 iOS 应用程序。

    我正在开发一个 iOS 应用程序 在该应用程序中 我有社交共享功能 并且社交共享功能使用深度链接来共享 URL 该网址共享对于所有应用程序都运行良好 除了WhatsApp 它会显示一个警报弹出窗口 此项目无法共享 请选择其他项目 以下是我的
  • git 提交错误:检测到大文件

    您好 我正在为 ios 8 1 开发一个应用程序 xcode 我已经使用 googleMaps 框架来实现自动完成功能 当我尝试在 Git 中推送我的项目时 我收到大文件检测错误 后来尝试使用 git lfs 并跟踪 git 检测到的文件
  • SKNode 上的 runAction 未完成

    我使用 NSOperation 子类来获取串行执行SKAction正如这个问题中所描述的 如何在 Swift 中子类化 NSOperation 以将 SKAction 对象排队以进行串行执行 https stackoverflow com
  • Swift 中的 UIAlert 自动消失?

    我有以下代码 Creates Alerts on screen for user func notifyUser title String message String gt Void let alert UIAlertController
  • 苹果推送通知在生产中不起作用

    我们完全陷入困境 请帮忙 我和我的团队制作了一个 iPhone 应用程序 这是我们第一次在 iOS 上尝试 一切都很好 直到我们提交应用程序并在应用程序商店上可用为止 推送通知服务无法正常工作 我在网上搜索并尝试根据人们的建议仔细检查我们的
  • IPV6 快速可达性

    我是 swift 和 xcode 的新手 并且我的应用程序因 IPV6 而被拒绝 性能 2 1 当我们执行以下操作时 您的应用程序会在运行 iOS 9 3 5 并连接到 IPv6 网络的 iPad 和 iPhone 上崩溃 具体来说 当我们

随机推荐

  • 单次迭代 => 从 Java 到 Scala 的多个输出集合

    我目前正在尝试将一些 Java 代码转换为 Scala 代码 挑战在于确保转换后的 Scala 代码与原始 Java 代码相比不会执行效率非常低的事情 例如当尝试转换以下代码时 class Person String name Intege
  • 关闭 viewController 后重新加载 tableView

    我有一个 ViewController VCA 里面有一个 TableView 从这个 ViewController 可以调用另一个 ViewController VCB 在第二个 VC 中 可以向 plist 添加一个项目 用于填充 VC
  • Twitter消费者密钥和秘密密钥有什么区别?

    我是 Twitter 开发新手 现在 我已经获得了消费者密钥和秘密密钥 但我不知道在哪里使用哪一个 用于登录的简单 JavaScript 代码不起作用 我其实想在推特上发布比赛的比分 任何人请指导我 谢谢 Twitter 有一个很棒的入门指
  • 为什么 readline() 将 stdin 回显到 stdout?

    我写了一个小的 C 程序 使用readline 从 stdin 读取输入 我没有从终端与其进行交互 而是编写了一个测试工具来执行 C 程序并为其提供输入 test harness stdout gt stdin gt C program s
  • 与 .Net 邮件附件一起使用时处置 MemoryStream

    我正在使用 MemoryStream 从存储在数据库中的二进制文件添加附件 我的问题是我想正确处置 MemoryStream 使用 using 语句可以轻松完成此操作 但是当我有多个附件时 我不知道如何正确处理多个 MemoryStream
  • Three.js - 在自定义几何体上平滑兰伯特材质着色的问题

    我在 Three js 中创建了一个自定义几何体 现在 我想创建一个使用平滑阴影兰伯特材质的网格 使用循环 我创建了顶点数组 然后创建了面 然后我调用了 geometry computeCentroids geometry computeF
  • Java BigInteger [重复]

    这个问题在这里已经有答案了 可能的重复 BigInteger 的困难 https stackoverflow com questions 10780209 diffucilty with biginteger import java mat
  • 为什么在内部类中使用公共方法?

    我们的一个项目中有很多代码如下所示 internal static class Extensions public static string AddFoo this string s if s null return Foo return
  • 如何将 Lua 嵌入到 Python 3.x 中?

    是否可以将 Lua 嵌入到 Python 3 x 中 如果是这样 我如何在我的 Python 程序中运行和执行 Lua 脚本 语言之间的交互有多好 例如 Lua 是否可以访问 Python 的所有变量和类以及 Python 是否可以访问 L
  • Angular 2/4 中的嵌套路由

    我正在开发一个应用程序 我打算具有以下结构 MAIN main container main routes NCF lazy loaded routes for it s subapps ACNP lazy loaded Component
  • 需要defaultReadObject()和defaultWriteObject()

    为什么需要写defaultReadObject and defaultWriteObject 作为第一个声明readObject ObjectInputStream o and writeObject ObjectOutputStream
  • 如何根据场景启用/禁用 html 按钮?

    我的网页上有一个带有以下代码的按钮 HTML
  • 使用 data.table 重新编码变量

    我正在尝试使用 data table 重新编码变量 我用谷歌搜索了近2个小时但找不到答案 假设我有一个 data table 如下 DT lt data table V1 c 0L 1L 2L V2 LETTERS 1 3 V4 1 12
  • 何时创建新的 NSURLSession?

    重用的最佳实践是什么NSURLSessions 据我所知 似乎只要配置 超时 缓存策略等 不需要更改 就不需要创建新的配置 因为您可以从中生成新任务 单个也可以NSURLSession可以被整个应用程序重用吗 每个域 端点 按要求 查看文档
  • google buildpack psycopg2-binary 错误:未找到 pg_config 可执行文件

    这是我的requirements txt中的 psycopg2 binary 2 8 3 通过 r requests base in 我正在 docker 镜像中构建 我的印象是 如果我安装psycopg2 binary vs psycop
  • 从 C# 项目内的自定义文件夹获取文件

    第一次海报 也是新手 我创建了一个 C winform 应用程序 我添加了一个 文档 文件夹 其中添加了 5 个 PDF 文件 在我的 Form1 中 我添加了一个按钮 在按钮单击事件中 我尝试从 文档 文件夹中获取文件 我用谷歌搜索了一下
  • File.listFiles() 使用 JDK 6 处理 unicode 名称(Unicode 规范化问题)

    在 OS X 和 Linux 上列出 Java 6 中的目录内容时 我遇到了一个奇怪的文件名编码问题 File listFiles 和相关方法似乎以与系统其他部分不同的编码返回文件名 请注意 给我带来问题的不仅仅是这些文件名的显示 我主要对
  • Laravel 和惯性.js 文件下载

    I uploaded a file to the database and created Storage link using php artisan storage link and everything work perfectly
  • MySQL 中多个表的 COUNT(*)

    如何从 MySQL 的多个表中选择 COUNT Such as SELECT COUNT AS table1Count FROM table1 WHERE someCondition JOIN SELECT COUNT AS table2C
  • 如何获取 UnsafeMutableRawPointer 的值?

    我试图获取 UnsafeMutableRawPointer 指向的地址 但我无法这样做 我也是 Swift 新手 所以我可能会遗漏一些东西或者做得完全错误 我最好将原始值转换为 CChar 路人注意 我的大部分回答没有意义 因为它没有回答上