Пустая строка при попытке конвертировать const char * в NSString

1

Я столкнулся с странной ошибкой, пытаясь получить 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();
}

Надеюсь, это поможет!

  • 1
    Я подозреваю, что myCFunctionReturningConstCharPtr() . можешь показать?
  • 0
    Не так просто, слишком много кода задействовано. Я попытаюсь сломать это и добавить это к моему вопросу. Я надеялся, что данный пример говорит сам за себя.
Показать ещё 7 комментариев
Теги:

1 ответ

4
Лучший ответ

Константа 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
  • 0
    Пожалуйста, смотрите код в моем обновленном вопросе выше. Из моего понимания это то, что я делаю. Я конвертирую мою стандартную строку, используя c_str (). Результат является константным и поэтому должен быть действительным, когда я его верну. Или я что-то упустил?
  • 0
    @de .: Нет, это недействительно. Как я пишу в своем ответе, этот массив символов принадлежит локальному объекту std::string , и когда он выходит из области видимости, массив символов удаляется. Вернуть std::string вместо const char* , как я и предлагал.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню