c++中传递字符指针容易犯的错误
作者:网络转载 发布时间:[ 2012/8/30 11:42:11 ] 推荐标签:
先看一段容易犯错的代码段:
#include<iostream>
using namespace std;
char* GetMe()
{
char st[]="hello word!";
return st;
}
int main()
{
char *str;
str=GetMe();
cout<<str<<endl;
return 0;
}
该段代码可能输出正确结果,也可能输出错误结果。原因是:GetMe函数中的str是局部变量,分配的是局部数组,他是在内存中的栈中申请的空间,超出该函数作用域之后st的内存空间会被收回,虽然返回的指针仍然指向该内存空间,但是空间中的值随时有可能会被改变,所以输出的有可能是错误结果。修改的方法一种是在全局区域申请内存空间,一种是在堆中申请内存空间。先看在内存的全局区域申请内存空间的代码,至于在堆区分配内存有关文章已经讲了,不再赘述:
#include<iostream>
using namespace std;
const char* GetMe()
{
char *st="hello word!";
//*st='t';
return st;
}
int main()
{
const char *str;
str=GetMe();
cout<<str<<endl;
return 0;
}
char *st=“hello word!”与上一段代码中的char st[]="hello word!"的区别是char *st=“hello word!”是在内存的全局区域申请的内存空间,全局区域的值是不能进行修改的。如代码中被注释起来的那一行,如果去掉注释,虽然编译时没错误,但是运行时程序会崩溃,因为修改了全局区域的值。所以在全局区域定义了变量之后,该值在程序结束之前是不会被改变的。另外需要普及的常识是:
程序用来存放数据 的内存分为四块:
1、全局区(静态区):全局变量和静态变量存储的地方,它与其他变量的不同之处是生命周期的不同,全局区的变量只有在程序结束时系统才会释放该块资源。
2、文字常量区:常量字符串存放的地方。它也是在程序结束时释放。
3、栈区:存放函数的参数值,局部变量值等,进入区域分配内存,超出区域收回内存。
4、堆区:程序员分配程序员释放。
当然了该题目也可以通过开辟一段静态内存区来实现,它与全局区是同一块内存,只是代码表示方式不同:
#include<iostream>
using namespace std;
const char* GetMe()
{
static char st[]="hello word!";
//*st='t';
return st;
}
int main()
{
const char *str;
str=GetMe();
cout<<str<<endl;
return 0;
}
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11