Swift 将C字符数组(不安全指针)转换为字符串

Swift 将C字符数组(不安全指针)转换为字符串,swift,unsafe-pointers,Swift,Unsafe Pointers,我有一个由CoreFoundation方法填充的unsafemeutablepointer 如果我用%s占位符记录它,它的输出很好 但是如果我尝试使用Swift的print,它只会写入内存地址 几乎什么都试过了。。。另外,我不明白为什么如果我试图访问底层内存属性,我会得到一个EXC\u BAD\u访问 let deviceName = UnsafeMutablePointer<Character>.alloc(64) /* other statements in which dev

我有一个由CoreFoundation方法填充的
unsafemeutablepointer

如果我用
%s
占位符记录它,它的输出很好

但是如果我尝试使用Swift的
print
,它只会写入内存地址

几乎什么都试过了。。。另外,我不明白为什么如果我试图访问底层
内存
属性,我会得到一个
EXC\u BAD\u访问

let deviceName = UnsafeMutablePointer<Character>.alloc(64)

/* other statements in which deviceName is filled */

NSLog("device %s by %s", deviceName, manufacturerName)
// Outputs correctly the string

print(String(deviceName[0]))
// Get an EXC_BAD_ACCESS error at runtime

print(String(deviceName.memory))
// Get an EXC_BAD_ACCESS error at runtime

let str = withUnsafePointer(&deviceName) { String.fromCString(UnsafePointer($0)) }
print(str)
// Outputs an empty string

print("\(deviceName) by \(manufacturerName)")
// Outputs just memory addresses
let deviceName=UnsafeMutablePointer.alloc(64)
/*填写deviceName的其他语句*/
NSLog(“设备%s由%s提供”,设备名称,制造商名称)
//正确输出字符串
打印(字符串(deviceName[0]))
//在运行时获取EXC\u BAD\u访问错误
打印(字符串(deviceName.memory))
//在运行时获取EXC\u BAD\u访问错误
让str=withUnsafePointer(&deviceName){String.fromCString(UnsafePointer($0))}
打印(str)
//输出一个空字符串
打印(“\(deviceName)by\(manufacturerName)”)
//仅输出内存地址

您似乎不愿意显示您的代码,所以我实在帮不了您。但这似乎是错误的:

let deviceName = UnsafeMutablePointer<Character>.alloc(64)
/* other statements in which deviceName is filled */
let deviceName=UnsafeMutablePointer.alloc(64)
/*填写deviceName的其他语句*/
这不是在Swift中获得C字符串的方法,如果您认为它是Swift中的C字符串,那么您就错了;它需要是一个Int8(C字符)数组,而不是Swift字符(结构!)才能成为C字符串


换句话说,C字符(你的问题的标题)不是快速字符——它们之间一点也不相似。C字符是一个小数字,Swift字符是C不知道的面向对象语言中的一个对象

你能再多看一点你的代码吗?这个指针中有什么,你在做什么,你在追求什么结果,当你尝试时会发生什么?那么我可以假设它实际上是一个C字符串吗?@matt是的,
deviceName
实际上是一个以C NUL结尾的字符数组,你尝试了
print(deviceName[0])
但没有得到第一个字母吗?这让我觉得你根本没有这个C字符串。你不能展示你是如何得到它的?我希望C字符串是一个不安全的指针。我不明白这怎么可能是一个不安全的指针。请阅读上面的评论。如果你想我可以复制整个代码,它只是有点长。我报告了填充数组的行。我已经告诉了您需要知道的内容。我不知道AudioObjectGetPropertyData是做什么的,但它无论如何都不能提供一个C数组的Swift字符。好的,现在我尝试了Int8,打印
deviceName[0]
结果是66,这是大写字母B的ascii码,对于“内置麦克风”,我相信您现在可以接受我的答案了。:)剩下的就交给你了。为了以后的参考,这段代码将生成Swift字符串:
string.fromCString(deviceName)