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

Empty string when trying to convert const char * to NSString

本文关键字:NSString 字符串 转换 const char      更新时间:2023-10-16

我在试图从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,然后再转换回来)。

我已经为此绞尽脑汁两天了,任何帮助都是非常感激的!由于

编辑:

这个字符串最初来自于PowerVR的内部SDK中的结构体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();
}

我希望这对你有帮助!

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

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

实际上,你返回的const char*指向一个由本地std::string对象封装的字符数组;std::string对象的析构函数释放该数组,当局部对象超出作用域时(即从函数返回时)调用析构函数。

之后对指针解引用的尝试会导致未定义行为,这意味着任何事情都可能发生。这包括您的程序在调试时看起来运行良好,但在没有附加调试器的情况下运行时就不是了。

你应该有你的函数返回(按值)一个std::string,然后调用c_str()上的返回值,如果你需要得到封装的c字符串:

std::string charString = myCFunctionReturningConstCharPtr(); 
printf("%s n", charString.c_str()); // prints the correct string