【问题标题】:malloc'd C string created in c file being lost when bridging to swift file on specific input在特定输入上桥接到 swift 文件时,在 c 文件中创建的 malloc'd C 字符串丢失
【发布时间】:2016-06-04 16:26:17
【问题描述】:

我正在制作一个用 swift 和 c 编写的字典应用程序。我正在使用 c、.h 和 .c 来搜索我拥有的字典文本文件以查找特定特征,这取决于用户输入到我称之为 DictionaryViewController 的内容。将输入数据传递给 c 函数并确定返回 char* 的方法很好,但是,在某些输入上,我创建的 char* 不会进入我的 swift 文件并产生一个 nil 值。如何确定swift可以访问我从c文件分配的内存?

//.c file

char* searchDictionary(char* u_input) {
char* returnValue = malloc(sizeof(char)*largeNumber);
//implementation
return (returnValue);
}


//.h file

char* searchDictionary(char* u_input);



//.swift file

var uin = userinput.text
let uinn = (uin as NSString).UTF8String
var uinnn = UnsafeMutablePointer<Int8>(uinn)
var out = UnsafeMutablePointer<Int8>.alloc(1)
out = searchDictionary(uinnn)
//out sometimes gets the value returned from searchDictionary
dictoutput.text = NSString(CString: out, encoding: NSUTF8StringEncoding)

【问题讨论】:

  • 我认为这与您的问题无关,而且我什至不了解 Swift,但我预计 var out = UnsafeMutablePointer&lt;Int8&gt;.alloc(1) 会导致少量内存泄漏。
  • 您遗漏了太多代码。制作一个可编译的完整示例来演示该问题。如果问题只是关于从 C 文件中获取字符串,则无需包含有关 dictoutputuserinput 的任何内容。问题很可能出在您未显示的代码中,并且与此问题无关。
  • 我已将 var out = UnsafeMutablePointer&lt;Int8&gt;.alloc(1) 更改为 swift 中的正常声明 var out : UnsafeMutablePointer&lt;Int8&gt;!。我强制分配,因为我认为 swift 的编译方式存在问题。从我的 c 文件中获取 char * 没有问题。在我的函数退出之前,我已经打印出 strlen 和 data 的内容,并且当我在 swift 中输出长度时,所有端口都结束了。但是,在特定输入上,我无法正常从我的 c 文件中获取 strlen 和数据,但是当我快速打印长度和数据时,我得到 nil 值。
  • 今天,我将尝试将输出写入文件并以这种方式快速访问我的 c 输出。我最初使用 c 以便我可以将 getc 与我的文件一起使用。我认为这可能是 swift 编译器的一个错误。
  • 我已经成功地将 c 函数返回的内容输出到一个文本文件中。即使文本文件具有正确的值,swift 仍然无法识别某些输出。我认为将 NSString 转换为 nil 值存在一个奇怪的编码问题。

标签: c swift memory-management c-strings bridging-header


【解决方案1】:

我发现了发生了什么。在 swift 和 c 之间使用 c 字符串时,请使用 NSASCIIStringEncoding。使用 NSUTF8StringEncoding 将为特定输入生成 nil 值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 2011-04-16
    • 2018-03-30
    • 1970-01-01
    相关资源
    最近更新 更多