char ポインタを取得して出力する単純なプログラム。
char * get()
{
char ss [256];
sprintf (ss,"%d",1);
return ss;
}
int _tmain(int argc, _TCHAR* argv[])
{
char *f = get();
cout<<f;
char d[50] ;
cin>> d;
}
出力にゴミしかありませんでした。なんで?
char ポインタを取得して出力する単純なプログラム。
char * get()
{
char ss [256];
sprintf (ss,"%d",1);
return ss;
}
int _tmain(int argc, _TCHAR* argv[])
{
char *f = get();
cout<<f;
char d[50] ;
cin>> d;
}
出力にゴミしかありませんでした。なんで?
関数はローカル変数のアドレスを返しています。コードには未定義の動作があり、予期しない結果が生じます。
ss
スタックに存在し、関数get()
はそれへのポインターを返します。
char * get()
{
} // Life time of ss ends here
代わりにstd::stringを使用してください。
get() 関数が戻ると、ローカル変数はスコープ外になります。つまり、その値は未定義になります。
解決するには、次を使用できます...
static char ss[255];
// or
char *ss = (char *)calloc(1,255);
// or with C++
char *ss = new char[255];
とか…
あなたはトレードオフを決定します。静的変数を使用すると、get() を呼び出すたびにバッファーの内容が変更される可能性があります。ただし、割り当てを伴うアプローチでは、呼び出し元はメモリを解放し、free() を使用するか削除するかを知る必要があります。呼び出されたときに関数にバッファを提供することで問題に対処するものもあります...
void get(char *buf, int limit);
// or
void get(char *buf, int& limitActual);
次に、主なことは、文字列を処理する場合、C/C++ (std::string でさえも) で何らかの方法で管理する必要があるメモリを処理することです。文字列では、自動変数には十分注意してください。
配列 ss[] は get() のスコープ内にのみ存在します。
したがって、 get() から返されるポインタは、関数を終了するとすぐに無効になります。