C/C++中二级指针传递参数【个人遇到内存值发生改变现象的记录及相关修正方法】

目录

0、前言

1、二级指针传参奇怪现象

2、分析

3、解决方法


0、前言

        在c/c++中,时常会使用到主调函数通过参数去获取被调函数中的数值情况。针对这种情况,我前面也写过C/C++主调函数从被调函数中获取(各种类型)数据内容方式的梳理归纳文章。但这篇文章中着重是写各基础数据类型的传递方式,如何传递一维数组值或者多维数组值得情况就没有涉及。那么在c/c++中,传递n维数值则需要通过n+1维的指针参数去传递。这篇文章就是去讲一下二级指针去传递数组值情况中发生的奇怪现象。需要了解详细的二级指针传参原理和过程可以去查看以下两篇文章:C语言参数传递(值传递、地址传递)+二级指针使用二级指针传出参数

1、二级指针传参奇怪现象

        项目需要,写了一个代码,运行后发现二级指针传参数值遇到打印会发生改变。抽象代码如下:

#include <stdio.h>

void f(int **y);//二级指针传参函数

int main()
{	
	int *kk = 0;
	f(&kk);
	printf("%d\n %d \n %d \n",kk[0],kk[1],kk[2]);
	getchar();
	return 0;
}
void f(int **y)
{
	int t[3]={6 , 7 ,10};//需要传出去数组的内容
	*y = t;
}

运行可以发现正确打印出需要的数值:

 然而在打印前面随意加个打印,再看打印数值就不对了:

        以上的现象着实让人难以理解,为此进行了一系列的分析。

2、分析

        根据调试和打印地址、内存值发现:

1)、f函数中添加printf(" %d \n %d \n %d \n", **y, *(* y + 1), *( * y + 2));//内部寻址获得的数值是正确的;

2)、在主函数中指针kk直接索引t数组:都在主调函数内,t的栈上内存不会消失,kk的寻址位置正确。

        最后定位到应该是调用f函数后获取被调函数f中t数组的值,将其内存地址赋给kk,运行完后局部变量t应该释放了。原因应该就是局部变量的释放导致了kk指向的内存数值发生变化。【这一块不理解的就是:f运行完理论内存值就不在了,为什么不加其他的打印,却能够正常打印?有知道的可以评论区说说】

3、解决方法

        根据问题的定位,进行相关的修改。发生以上问题的原因就是被调函数f中的数组t是局部变量,在函数f被调用运行完后,t变量定义在栈上的内存将被释放。打印内存数据将会导致打印内容错误。

        为此进行修改,即将其中需要传递值得数组进行全局定义。或者直接在堆上创建内存,然后再进行值的拷贝或者传递(该部分就是需要记得手动释放内存,不是很推荐)

1)、全局直接定义数组,被调函数中赋值

 2)、static指定数组指向全局变量所在空间

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

nanke_yh

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

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

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

打赏作者

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

抵扣说明:

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

余额充值