1

获取 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;
}

我的输出只有垃圾。为什么?

4

3 回答 3

7

函数正在返回局部变量的地址。该代码具有未定义的行为并给出无法预料的结果。

ss驻留在堆栈上,函数get()返回一个指向它的指针。

char * get()
{
} // Life time of ss ends here

改用std::string

于 2012-07-18T15:04:51.533 回答
2

当 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)中,您正在处理必须以某种方式管理的内存。使用字符串时,要非常小心自动变量。

于 2012-07-18T15:06:21.830 回答
2

您的数组 ss[] 仅存在于 get() 的范围内。
因此,一旦您离开函数,您从 get() 返回的指向它的指针就无效了。

于 2012-07-18T15:06:56.380 回答