目录
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指定数组指向全局变量所在空间