一个C++的问题.

来源:百度知道 编辑:UC知道 时间:2024/05/16 00:20:11
请看这个程序的运行结果是什么? 为什么是那样的?
#include <iostream.h>
char *GetMemory()
{
char p[]="hello world";
return p;
}
void main()
{
char *str=NULL;
str=GetMemory();
cout<<str<<endl;
}
不是输出的:hello world

这是一个典型的错误
首先char p[]="hello world";是一个字符型数组(字符串),是一个局部变量数组(定义在栈上的变量,其特点是变量所使用的内存由系统自动管理其分配和回收,而定义在堆上的变量则需要程序员自己手动的进行分配与回收),其作用域为函数体内,出了函数体就出了作用域范围,当执行完return p; 后,这个数组也就立即被销毁了.
所以执行str=GetMemory(); 后,str得到的是一个已经被销毁了的字符数组的首地址的值,那内容是什么?天知道!已经是一堆垃圾数据了.
那么如何才能得到"hello world"的结果呢?
可以这样改:
char* GetMemory()
{
//通过new可以在堆上定义数组,那么就不会在函数结束时被程序自动销毁
char *p = new char[12];
strcpy(p, "hello world");
return p;
}
这样就符合这个函数的名字了GetMemory--取得一块内存
不过这块new出的内存用完后必须手动的释放(用delete),
在cout<<str<<endl; 这后加上
delete str;

#include <iostream.h>
char *GetMemory()
{
char p[]="hello world";
//此处的“hello world”位于栈上,函数结束时系统会收回其内存
return p;
//返回p会虽然不会发生错误,但此时的p指向一堆垃圾
}
void main()
{
char *str=NULL;
str=GetMemory();
//str得到一堆垃圾的地址,也可能是其它数据
cout<<str<<endl;
//不是我们想要的
}

c++
C++