2013-03-24 103 views
1

我在尝试从const char *中获取NSString时遇到了一个奇怪的错误。尝试将常量字符*转换为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(); 
} 

我希望帮助!

+1

我会怀疑'myCFunctionReturningConstCharPtr()' 。你能证明吗? – 2013-03-24 12:23:55

+0

不是那么容易,涉及的代码太多了。我会尽力将其分解并添加到我的问题中。我希望这个例子能代表自己。 – 2013-03-24 12:27:39

+0

我对'const char *'返回的方式感兴趣。特别是,它是通过调用'data()'还是'c_str()'从本地'std :: string'对象获得的。 – 2013-03-24 12:28:44

回答

4

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 
+0

请参阅上面我更新的问题中的代码。根据我的理解,这就是我所做的。我使用c_str()转换我的std字符串。结果是一个常量,因此在返回时应该仍然有效。或者我错过了什么? – 2013-03-24 12:46:16

+0

@de .:不,它是无效的。正如我在我的回答中写的那样,该字符数组由本地'std :: string'对象拥有,并且当它超出作用域时,字符数组将被删除。正如我所建议的那样,返回'std :: string'而不是'const char *'。 – 2013-03-24 12:48:42

+0

好的,我明白了。但我必须转换为C,因为我的API只有c,没有C++。 – 2013-03-24 12:50:26