0

我试图在运行时CFStringRef从 a创建一个新的const char*,但CFStringCreateWithCString返回null所有短于 10 个字符的字符串:

// Test w/ 9-character string
CFStringRef str1 = CFStringCreateWithCString(NULL, "123456789", kCFStringEncodingUTF8);
printf("str1: %p - %s\n", str1, CFStringGetCStringPtr(str1, kCFStringEncodingUTF8));

// Test w/ 10-character string
CFStringRef str2 = CFStringCreateWithCString(NULL, "0123456789", kCFStringEncodingUTF8);
printf("str2: %p - %s\n", str2, CFStringGetCStringPtr(str2, kCFStringEncodingUTF8));

上述示例的输出:

str1: 0x1ea1f72bb30ab195 - (null)
str2: 0x1005073e0 - 0123456789

如您所见,第一个字符串(由 9 个字符组成)返回null,而第二个字符串(10 个字符)工作正常。

我做了一些测试,它似乎CFStringCreateWithCString适用于所有超过 10 个字符null的字符串,但总是返回 9 或更少的字符串。

什么可能导致这种行为,我该如何解决?

4

1 回答 1

0

CFStringCreateWithCString适用于两个字符串。的文档CFStringGetCStringPtr说:

快速获取指向 C 字符串缓冲区的指针,该缓冲区包含给定编码中字符串的字符。

此函数要么立即返回请求的指针,不分配内存,也不进行复制,在恒定时间内,或者返回 NULL。如果是后者,则调用替代函数(例如 CFStringGetCString 函数)来提取字符。

此函数是否返回有效指针或 NULL 取决于许多因素,所有这些都取决于字符串的创建方式及其属性。此外,函数结果可能会在不同版本和不同平台上发生变化。因此,在任何情况下都不要指望从该函数接收到非 NULL 结果。

于 2017-04-21T20:50:09.080 回答