获取 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() 还是 delete。有些人通过在调用时向函数提供缓冲区来解决问题,比如......
void get(char *buf, int limit);
// or
void get(char *buf, int& limitActual);
然后主要的是,在处理字符串时,在 C/C++(甚至 std::string)中,您正在处理必须以某种方式管理的内存。使用字符串时,要非常小心自动变量。
您的数组 ss[] 仅存在于 get() 的范围内。
因此,一旦您离开函数,您从 get() 返回的指向它的指针就无效了。