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

news2024/12/22 18:43:31

目录

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/147562.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ONE·R || 两次作业(一):R基础数据处理】

总言 两次作业汇报&#xff1a;其一。    文章目录总言1、作业一&#xff1a;1.1 、任务一&#xff1a;各项数据建立1.2 、任务二&#xff1a;去除缺失值1.3 、任务三&#xff1a;返回性别为女生&#xff0c;年龄<20的学生及成绩1.4、 任务四&#xff1a;统计性别为女生&a…

【Python百日进阶-数据分析】Day149 - plotly直方图:go.histogram()

文章目录4.2 利用 go.Histogram 的直方图4.2.1 基本直方图4.2.2 归一化直方图4.2.3 水平直方图4.2.4 叠加直方图4.2.5 堆叠直方图4.2.6 风格直方图4.2.7 直方图条形文本4.2.8 累积直方图4.2.9 指定聚合函数4.2.10 自定义分箱4.2.11 在直方图之间共享 bin4.2.12 按类别顺序排序直…

深度学习(一)-环境安装

前言&#xff1a; 最近电脑重装了下系统&#xff0c;然后所有环境啥的都得重新配置一遍&#xff0c;刚好趁着这个时间记录下整个环境的配置过程 注意&#xff1a;本文记录的仅为window系统的配置过程! 一、Anaconda安装及相关配置 Anaconda下载地址&#xff0c;根据需要选择需…

TypeScript 中 Class incorrectly implements interface 错误

当一个类在没有指定接口上定义的所有属性和方法的情况下实现接口时&#xff0c;会发生错误“Class incorrectly implements interface”。 要解决该错误&#xff0c;需要确保定义并键入接口的所有必需属性和方法。 下面是产生上述错误的示例代码 interface Employee {id: num…

Linux学习记录——유 gcc/g++基础知识

文章目录一、程序翻译二、gcc使用1、-o2、预处理-E3、编译-S4、汇编-c5、链接三、库四、库的部分实际操作五、Linux项目自动化构建工具 make/Makefile1、规则一、程序翻译 C语言中&#xff0c;写出代码后&#xff0c;编译器会经过四个阶段才会生成可执行文件。 预处理&#x…

计算数组中元素的加权平均值 numpy.average()

【小白从小学Python、C、Java】【计算机等级考试500强双证书】【Python-数据分析】计算数组中元素的加权平均值numpy.average()[太阳]选择题对于以下python代码最后输出的结果是?import numpy as npa np.array([1, 2, 3, 4])print("【显示】a")print(a)print("…

如何进行Java 单元测试

什么是单元测试 维基百科中是这样描述的&#xff1a;在计算机编程中&#xff0c;单元测试又称为模块测试&#xff0c;是针对程序模块来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中&#xff0c;一个单元就是单个程序、函数、过程等&#xff1b;…

架构师课程笔记day04——Nginx

大纲 1.从单体到集群过渡 2.Nginx 2.1什么是nginx 2.2常见服务器 2.3nginx在架构中所处位置 2.4使用率&#xff0c;性能&#xff0c;市场占有率等信息 2.5正反向代理啥意思 正向代理 反向代理 示例 2.6安装步骤 Nginx安装步骤 常用命令等 2.7请求链路 2.8进程模型 通用模型 …

JS面向对象基础(原型链、构造函数、new关键字、寄生组合继承、对象元编程)

这篇文章将简单介绍面向对象的基本概念&#xff0c;以及JS语言是如何支持面向对象这种编程范式的&#xff0c;最后还会讲解一些对象元编程的基础知识。通过阅读这篇文章&#xff0c;你可以了解JS中的原型链机制&#xff0c;new和构造函数的原理、寄生组合继承的实现以及对象元编…

李群李代数学习笔记

前言 因为论文学习的需要&#xff0c;入门了一下李群和李代数&#xff0c;觉得B站的这个视频讲得不错&#xff1a;视频地址为机器人学——李群、李代数快速入门&#xff0c;这里记录一下。 前言引入&#xff1a;一些常见的例子S1S^1S1&#xff1a;单位复数SO(2)SO(2)SO(2)&…

ArcGIS基础实验操作100例--实验64创建统计图符号

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验64 创建统计图符号 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&am…

24考研数学复习方法、全年规划

文章目录各个阶段推荐的辅导书和习题1.教材基础&#xff1a;22年9月-23年3月复习“三基”2.强化阶段&#xff1a;23年4月-23年8月3.真题阶段&#xff1a;23年9月-10月4.冲刺模拟阶段&#xff1a;23年11-12月各个阶段推荐的辅导书和习题 阶段(时间)辅导教材习题册1.基础阶段(1-…

Vue初识系列【2】内容升级版

文章目录一 模板语法1.1 文本1.2 原始THTML1.3 属性Attribute1.4 JavaScript表达式的使用二 条件渲染2.1 v−if&v−elsev-if\&v-elsev−if&v−else2.2 v−showv-showv−show2.3 v−ifv-ifv−if与v−showv-showv−show的区别三 列表渲染3.1 v−forv-forv−for列表渲…

OpenSceneGraph几何基础教程【OSG】

默认情况下&#xff0c;OSG 使用顶点数组法和显示列表法来渲染几何体。 但是&#xff0c;渲染策略可能会发生变化&#xff0c;具体取决于几何数据的呈现方式。 在本文中&#xff0c;我们将了解在 OSG 中处理几何体的基本技术。 OpenSceneGraph 后端的 OpenGL 使用几何图元&…

Typora 图床教程(阿里云版)

由于码云现在需要登录才能看到相关图片文件后&#xff0c;导致我们已经不能愉快的使用它作为图床了&#xff0c;所以我们需要使用其他工具来作为图床使用了&#xff0c;本文使用阿里云OSS作为Typora的图床。 阿里云OSS相较于其他几个方法来说最大的优点就是稳定了&#xff0c;…

《图机器学习》-Machine Learning for Graphs

Machine Learning for Graphs一、Application of Graph ML一、Application of Graph ML 图机器学习的任务可以分为四个类型&#xff1a; NodelevelNode\ levelNode level(结点级别)EdgelevelEdge\ levelEdge level(边级别)Community(subgraph)levelCommunity(subgraph)\ level…

【rpm】源码包制作rpm包|修改rpm、重新制作rpm包

目录 前言 安装rpmbuild rpmbuild制作rpm 包 同时生成devel包 修改rpm、重新制作rpm包 RPM 打包 工具 SPEC文件 rpmbuild的目录和Spec宏变量和参数说明 preamble部分 Body 部分 标题宏变量/工作目录 spec文件信息 符号说明 CMake制作rpm包 HelloWorld 更多SPEC…

微信小程序开发——小程序的宿主环境—组件

一.小程序的宿主环境—组件1.小程序中组件的分类小程序中的组件也是由宿主环境提供的&#xff0c;开发者可以基于组件快速搭建出漂亮的页面结构。官方把小程序的组件分为了9大类&#xff0c;分别是&#xff1a;1.视图容器 2.基础内容 3.表单组件 4.导航组件5.媒体组件 6.map 地…

企业寄件管理系统使用教程

专为企业量身打造的寄件管理类平台&#xff0c;也就是企业寄件管理系统。其存在的意义在哪里&#xff1f;又是如何运用的&#xff1f;我们往下看看......讨论它存在的意义在哪里&#xff0c;我们先来看看企业普遍存在的寄件场景痛点&#xff1a;1、最早的手写快递单&#xff0c…

一维差分(例acwing重新排序)

一维差分是为了解决访问一个数组中的几个区间&#xff0c;降低时间复杂度使用的差分就是前缀和的逆运算&#xff08;a[i]b[1]b[2]…b[i]&#xff09;差分的作用就是快速实现将数组部分加上一个数。例如给定一个数组 A 和一些查询 Li,Ri&#xff0c;求数组中第 Li 至第 Ri 个元素…