尝试将const char *转换为NSString时为空字符串

时间:2013-03-24 12:22:55

标签: c++ objective-c

我在尝试从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();
}

我希望有所帮助!

1 个答案:

答案 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