我在尝试从const char *中获取NSString时遇到了一个奇怪的错误。
// in my obj c class
void myObjCMethod {
const char* charString = myCFunctionReturningConstCharPtr();
printf("%s \n", charString); // prints the correct string
// ...put a brakpoint here...
NSString * nsString1 = [NSString stringWithUTF8String:charString];
NSLog(@"%@", nsString1); // prints nothing
NSString * nsString2 = [NSString stringWithFormat:@"%s",charString];
NSLog(@"%@", nsString2); // prints nothing either
}
来自我的c方法的const char很好地打印到控制台。但是尝试转换为NSString会导致空字符串。 现在最奇怪的是,当我尝试调试代码并设置断点时(如上所示),我的NSString突然变得有效!
那么什么 - 我的测量会改变结果?很久以前,物理课听起来很熟悉,但我怀疑这里有量子力学。
注意:
我暂时省略了myCFunctionReturningConstCharPtr()
的实现,因为它会添加另一层可能与当前问题无关的复杂性(涉及多个c ++库,字符串已从char指针转换到std :: string和back)。
我已经对这个问题持续了两天了,非常感谢任何帮助!感谢
修改
该字符串最初来自PowerVR的Insider SDK中的struct SPODNode
。
我们有:
struct SPODNode {
PVRTchar8 *pszName;
// ...
}
使用:
typedef char PVRTchar8;
在我的代码中我做了:
std::string MyCppClass::pvrNodeName() {
if (node && node->pszName) {
string stdName(node->pszName);
return stdName;
}
return string();
}
最后在myCFunctionReturningConstCharPtr()
:
const char * myCFunctionReturningConstCharPtr() {
std::string stdString = myCppClassInstace->pvrNodeName()
return stdString.c_str();
}
我希望有所帮助!
答案 0 :(得分:4)
const char *是通过在std :: string上调用.c_str()获得的。
您的程序很可能具有未定义的行为,因为您返回的指针指向从函数myCFunctionReturningConstCharPtr()
返回时已取消分配的字符数组。
实际上,const char*
返回指向由本地std::string
对象封装的字符数组; std::string
对象的析构函数释放该数组,并在本地对象超出范围时调用析构函数,即从函数返回时。
稍后尝试取消引用您收到的指针会导致未定义行为,这意味着任何事情都可能发生。这包括您的程序在调试时看起来运行正常,但在没有附加调试器的情况下运行时则不行。
如果需要获取封装的C字符串,则应该让函数返回(按值)std::string
,然后对返回的值调用c_str()
:
std::string charString = myCFunctionReturningConstCharPtr();
printf("%s \n", charString.c_str()); // prints the correct string