我正在尝试在运行时从CFStringRef
创建新的const char*
,但CFStringCreateWithCString
会为所有短于10个字符的字符串返回null
:
// 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个字符的所有字符串,但对于9或更少的字符串,总是返回null
。
可能导致此行为的原因以及如何解决?
答案 0 :(得分:0)
CFStringCreateWithCString
适用于两个字符串。 CFStringGetCStringPtr
的文档说:
快速获取指向C字符串缓冲区的指针,该缓冲区包含给定编码中字符串的字符。
此函数在常量时间内立即返回请求的指针,没有内存分配和复制,或返回NULL。如果后者是结果,则调用替代函数(如CFStringGetCString函数)来提取字符。
此函数是否返回有效指针或NULL取决于许多因素,所有因素都取决于字符串的创建方式及其属性。此外,功能结果可能会在不同版本之间和不同平台上发生变化。因此,在任何情况下都不要指望从此函数接收非NULL结果。