Я столкнулся с странной ошибкой, пытаясь получить NSString из const char *.
// 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
}
Свойство const, исходящее из моего метода c, красиво печатает на консоли. Но попытка конвертировать в NSString приводит к пустой строке. Теперь самое странное, что когда я пытаюсь отладить код и установить точку останова (как указано выше), мой NSString внезапно станет действительным!
Итак, что - мои измерения меняют результат? Звучит знакомо из класса физики давно, но я сомневаюсь, что здесь задействована квантовая механика.
Заметка:
В настоящее время я опустил реализацию myCFunctionReturningConstCharPtr()
, так как это добавит еще один уровень сложности, который, вероятно, не связан с данной проблемой (существует несколько библиотек c++, строка была преобразована из указателя char в std:: строка и обратно).
Я бил головой об этом в течение двух дней, любая помощь очень ценится! благодаря
РЕДАКТИРОВАТЬ:
Строка изначально поступает из структуры SPODNode
из PowerVR 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();
}
Надеюсь, это поможет!
Константа char * получается путем вызова.c_str() в std :: string.
Очень вероятно, что ваша программа имеет Undefined Behavior, потому что вы возвращаете указатель на массив символов, который освобождается при возврате из функции 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
std::string
, и когда он выходит из области видимости, массив символов удаляется. Вернуть std::string
вместо const char*
, как я и предлагал.
myCFunctionReturningConstCharPtr()
. можешь показать?