2011-01-26 3 views
0

Я получаю неверную ошибку указателя при вызове функции ниже. Почему это происходит?C++ string: Недопустимая ошибка указателя

void Get(const char* value) 
{ 
    string st("testing string"); 
    string val = st.substr(1, st.length()); 
    value = val.c_str();   
} 

int main() 
{ 
    const char *val = NULL; 
    GetVal(val); 
    cout<<val; 
} 

Целью является возвращение подстроки.

ответ

8

val переменная внутри Get() получает разрушение после того, как Get() возвращается, при этом указатель на val тело становится недействительным. Также параметр value - это копия исходного указателя, поэтому исходный указатель val в функции main() остается неизменным и сохраняет значение нулевого указателя.

Изменить его

string Get() 
{ 
    string st("testing string"); 
    string val = st.substr(1, st.length()); 
    return val; 
} 
2

Я вижу две ошибки:

  • Вы назначаете val.c_str() к указателю, который является локальным для GetVal();
  • val уничтожен в конце GetVal(), поэтому значение указателя в любом случае будет недействительным.
1

Предпочитаете использовать std::string.

string Get() 
{ 
    string st("testing string"); 
    return st.substr(0, st.length()/2);//returning substring 
} 

string s = Get(); 

Кстати, интересная статья (Херб Саттер) вы хотели бы прочитать сейчас:

GotW #88: A Candidate For the “Most Important const”

Смежные вопросы