c++ 返回局部变量char *

文章讨论了C/C++中的四个函数,涉及constchar*、char*和string&的返回,解释了为何constchar*能正确返回,同时介绍了不同存储区域的特点,如栈区、堆区、全局/静态存储区和常量存储区的作用。
摘要由CSDN通过智能技术生成

看到一个这个题目:

问下面四个函数能正确返回的是:

const char* func()
{
	const char* buff = "hello world";
	return buff;
}

char *func2()
{
	char buff[] = "hello world";
	return buff;
}

char *func3()
{
	static char buff[] = "hello world";
	return buff;
}

string& func4()
{
	string buff("hello world");
	return buff;
}

答案是1、3;

之前了解的是,const char* buff 定义的是局部变量,在函数结束后应该是被销毁了的,为什么能正常返回呢?

根据上面运行的结果可知,定义的buff变量,跟字符串常量,以及返回的结果的地址都是同一个。

变量buff在函数结束后,肯定是被销毁了,但是字符串常量是存在常量区的,在程序结束前都可以访问。

这就是为什么第一个函数的可以正常返回。

这里再记录一下c/c++的几个存储区域说明:       

1、栈区

        主要存储局部变量、形参

2、堆区

        由程序员自己分配例如,malloc()、new()。需要自己主动释放

3、全局/静态存储区

        bss段:未初始化的全局变量和未初始化的静态变量存放在这里

                        初始化为0的全局变量和初始化为0的静态变量存放在bss段

        data段:已初始化的全局变量和静态变量存放在data段

注:data需要占用可执行文件文件,其内容由程序初始化。因此同一个全局变量是否赋初值可导致可执行文件的大小发生改变

4、常量存储区

        字符串、数字常量存放在常量区。const修饰的全局变量存放在常量区。

5、代码区

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值