函数返回值是指针的注意点、static限制子函数内部的局部变量、指向数组的指针如何表示数组元素

本文探讨了在C语言中,函数返回指针时应注意的事项,特别是不能返回局部变量的地址。解释了由于栈空间的清理,这样做可能导致指针失效。提出了两种正确实现方式:1) 通过参数传递数组地址并在函数内部操作;2) 使用静态变量。强调了对指针和数组的理解,并推荐使用第一种方法以避免静态存储区的占用。
摘要由CSDN通过智能技术生成

本内容主要研究指针类型的函数在返回指针时需要注意:不要返回函数内局部变量的指针。

本想简单的写一个通过指针修改数组元素值的指针类型的函数,结果暴露的问题还真不少,说明基本功还是不够扎实。

下面来看一下:当函数返回值类型是指针时需要注意的点:

先看程序:

#include<stdio.h>
#include<string.h>

int* GetNum()
{
	int array[10];

	for (size_t i = 0; i < 10; i++)
	{
		array[i] = i;
	}


	return array;
    【注意点1】:这里编译器提示警告,返回了局部变量或临时变量的地址。
    这里返回了此函数中的局部数组变量的地址,但是在函数return之后此函数结束执行,
数组所在的栈空间将会清空,虽然地址还在,但是上面的数值已经不能保证了,所以:注意点:不要返回函数内部栈内存上的变量的地址!
}

int main(int agrc, char* argv[])
{
	int* p = GetNum();

	for (size_t i = 0; i < 10; i++)
	{
		printf("p[%d]=%d\n", i, *(p + i));

	}

	for (size_t i = 0; i < 10; i++)
	{
		printf("p[%d]=%d\n", i, *p[i]);
        【注意点2】这一步的操作是想到指针p变量的结果是一个数组元素的首地址,
所以误认为指针p就能完全当数组名来用了,所以竟然出现了p[i]这样的写法!注意,p是一个指针变量啊,
又不是指针数组,怎么还能写出p[i]这种东西来。人家说指针指向数组时,
是用*(p+i)来寻址下一个元素,不是*p[i],第二种写法完全就是错误的。
对于数组名来说,int array[10];用*(a+i)或者array[i]都可以,
那是因为数组名本身就是一个指针!!!
记住,对于非数组名的指向数组的指针变量,只能用*(p+i)!

	}

	return 0;

}

如果想要实现上述功能,正确的方法有两种:

1.在子函数中进队指针进行操作,在main主调函数中定义数组,把main函数中的数组指针传递给子函数,这样数组变量时开辟在main函数的栈区中的,整个程序结束的时候该地址上的数值才会被释放。如下:

#include<stdio.h>


int* GetNum(int* arry)
{


	for (size_t i = 0; i < 10; i++)
	{
		*(arry + i) = i;
	}


	return arry;
}

int main(int agrc, char* argv[])
{
	int a[10];

	int* p = GetNum(a);

	for (size_t i = 0; i < 10; i++)
	{
	
		printf("p[%d]=%d\n", i, *(p + i));

	}

	return 0;

}

2.static,设置为静态变量的方法。这种方法是可以返回函数局部变量地址的,但是这个局部变量应当声明为static静态变量,存储在静态存储区,直到程序结束才释放!如下代码:

#include<stdio.h>
#include<string.h>

int* GetNum()
{
	static int array[10];
虽然array[]数组定义在函数内部,但是因为static,实际上是存储在静态存储区的,即使GetNum调用完成,其内存空间上的值也不会被释放。

	for (size_t i = 0; i < 10; i++)
	{
		array[i] = i;
	}


	return array;
	【注意点3】:这里编译器不再报错,因为虽然返回了函数内部变量的地址,但这个变量是静态变量,放在静态存储区中,
	即使函数调用结束,改内存空间也不会被释放,直到程序结束,该内存空间才会释放,所以还是能够得到正确的值。
}

int main(int agrc, char* argv[])
{
	int* p = GetNum();

	for (size_t i = 0; i < 10; i++)
	{
		printf("p[%d]=%d\n", i, *(p + i));

	}

	return 0;

}

总结来说:如果函数的返回类型是指针,不能返回函数内定义的局部变量的非静态变量的地址。要么将main函数中的局部变量的地址作为入参给指针类型的函数;要么可以在子函数内部定义局部变量,且返回该局部变量的地址,但是该局部变量应该是声明为static形式的。

//其实从上面两种方法来看,还是推荐第一种,因为这样不用在静态存储区一直存储着一些数值,毕竟无论如何,main函数中的局部变量是一直在栈区上存在的(纯属个人理解)

还是基础不牢固,很多愚蠢的小问题,需要多加练习。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小哇123

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值