2013-03-24 56 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

相關問題