GO与C比较:指针函数返回局部变量地址的不同

本文探讨了C语言中函数返回局部变量及其指针时的内存管理问题,指出C语言中返回局部变量地址可能导致段错误,而通过使用`static`可以避免。在GO语言中,即使不使用`static`,编译器会自动处理局部变量,将其移到堆上以防止内存错误,同时利用垃圾回收机制避免内存泄漏。
摘要由CSDN通过智能技术生成

#GO与C比较:指针函数返回局部变量地址的不同
##C语言函数中如何返回变量与指针?
在C语言中,一个函数可以直接返回函数中定义的局部变量,其实在函数返回后,局部变量是被系统自动回收的,因为局部变量是分配在栈空间,那为什么还可以返回局部变量,其实这里返回的是局部变量的副本(拷贝)。

#include <stdio.h>

int fun()
{
	int a = 10;
	return a; //返回的是a的副本
}

int main()
{
	int b;
	b = fun();
	printf("%d\n", b);
}
$ ./a.out
10

如果将上面这个例子改成下面:

#include <stdio.h>

int *fun() //指针函数 (返回值是一个地址)
{
	int a = 10;
	return &a;  //返回变量a的地址
}

int main()
{
	int *b = NULL;
	b = fun();
	printf("%d\n", *b);
}
编译时会有警告:
main.c:14:12: warning: function returns address of local variable [-Wreturn-local-addr]
$ ./a.out 
Segmentation fault (core dumped) //运行发生段错误

这里之所以发生段错误,是因为函数返回后,系统自动回收了函数里定义的局部变量,所以运行时去访问一个被系统回收后的地址空间,一定就会发生段错误,这是C/C++语言的特点。当然,也有办法让其不产生段错误,前面说过࿰

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JXES智能生态系统

如文章对你有用,请作者喝个咖啡

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

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

打赏作者

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

抵扣说明:

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

余额充值