2011-01-26 10 views
0

以下の関数を呼び出すと、無効なポインタエラーが発生します。なぜこうなった?C++文字列:無効なポインタエラー

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

valGet()が一旦破棄されると、Get()が返され、valボディへのポインタが無効になります。また、valueパラメータは元のポインタのコピーなので、元のvalポインタはmain()の関数に変更されず、nullポインタ値を保持します。

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

変更、それを私は2つの過ちを参照してください。あなたはGetVal()にローカルなポインタにval.c_str()を割り当てる

  • を。
  • 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”