关于C函数返回指针

你真的理解C语言函数返回类型是指针的情况吗?

2021-01-05 14:41:15

char *test1()
{
	char b[10]="abc";
	return b;
}
char *test2()
{
	static char b[10]="abc";
	return b;
}
char *test3()
{
	char b[10]="abc";
	char *pb=b;
	return pb;
}
char *test4()
{
	char *b="abc";
	return b;
}

才一下上边四个函数的返回值情况,并分析一下。

分析:

在这里插入图片描述

test1有可能不能运行;因为char b[10] 是局部变量,其存放在栈上,在函数执行完成就会被释放。而返回它存放的地址,此时已经是可能是个非法地址。

test2可以正确运行,在test1中,我们说test1不能运行或出现编译错误的原因是 b[]数组在函数执行结束后会被释放,如果我们再对其存放空间进行访问就会出错,此时我们定义static char b[10]; 将其存放在静态存储区,只有在程序运行结束后才会被系统回收,即使退出该函数,b[]数组存放的静态存储区始终存在,所以,我们再对其进行访问,不会出现错误。

test3可以运行。b[10]和*pb均保存在栈中;该函数返回值是保存在pb指针中的b数组在栈中的存放地址,当调用该函数时,该地址被复制到外部的指针变量中,然后,保存在栈上的c[]数组和pb指针的内存空间被释放。b[]数组的存放地址是被传送出去了的,但是,由于b[]是局部变量, 在函数执行完成后,存放的内存空间就被释放,所以,在外部通过指针访问b[]数组时,指向的内存空间无效,而且还可能出现访问非法内存的危险。虽然这样能够运行,但是没有实际效果。

test4可以运行。*b指针b是保存在栈中,"abc"字符串保存在文字常量区,其存放空间,直到程序执行结束才会被系统回收。所以,返回它的地址是一个实际存在的有效地址。

综上可以看到指针的值都可以正常返回,只是指针指向地址的值是否正常取决于这个值存放的区域。

扩展:

1、栈区(stack): 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) : 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3、全局区(静态区)(static):全局变量和静态变量的存储都是在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域, 程序结束后有系统释放 。
4、常量区:常量、字符串常量池就是放在这里的, 程序结束后由系统释放 。
5、程序代码区:存放函数体的二进制代码。

  • 9
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

离水的鱼儿

一分也是爱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值