1

我在尝试从 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 并返回) .

两天来我一直在努力解决这个问题,非常感谢任何帮助!谢谢

编辑:

该字符串最初来自SPODNodePowerVR 的 Insider SDK 的结构。我们有:

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();
}

我希望这会有所帮助!

4

1 回答 1

4

const char * 是通过在 std::string 上调用 .c_str() 获得的。

您的程序很可能具有未定义的行为,因为您正在返回一个指向字符数组的指针,该字符数组在从函数返回时被释放myCFunctionReturningConstCharPtr()

实际上,const char*您返回指向由本地std::string对象封装的字符数组;对象的析构函数std::string释放该数组,当本地对象超出范围时调用析构函数,即从函数返回时。

稍后尝试取消引用您收到的指针会导致未定义的行为,这意味着任何事情都可能发生。这包括您的程序在被调试时似乎运行良好,但在没有附加调试器的情况下运行时却没有。

您应该让函数返回(按值) an std::string,然后c_str()在需要获取封装的 C 字符串时调用该返回值:

std::string charString = myCFunctionReturningConstCharPtr(); 
printf("%s \n", charString.c_str()); // prints the correct string
于 2013-03-24T12:34:24.307 回答