c++中传递字符指针容易犯的错误

先看一段容易犯错的代码段:

#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;
}


  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值