多级指针和静动态内存的跨函数访问

参考:多级指针(静动态内存的跨函数访问)
作者:枕上
发布时间:2021-07-15 00:27:17
网址:https://blog.csdn.net/jinchi_boke/article/details/118724993?spm=1001.2014.3001.5501

目录

  • 多指针初认识:
  • 动态内存和多级指针的跨函数访问
  • 动态内存和静态内存的比较:
  • 静态内存不可以跨函数访问:
  • 动态内存跨函数访问:

多指针初认识:

#include <stdio.h>
#include <stdlib.h>
int main()
{int i = 100;int *p = &i;int **q = &p;int ***r = &q;//r = &p;   //error 因为r是 int*** 类型,r只能存放 int** 类型变量的地址printf("i = %d\n",***r);	system("pause");return 0;
}

输出结果:

i = 100

动态内存和多级指针的跨函数访问

#include <stdio.h>
#include <stdlib.h>void f(int **p)
{*p = 10;
}int main()
{int *p = (int *)malloc(4);f(&p);	printf("*p = %d\n",p);system("pause");return 0;
}

输出结果:

*p = 10

动态内存和静态内存的比较:

静态内存是由系统自动分配,由系统自动释放

静态内存是在栈分配的

动态内存由程序员手动分配,手动释放

动态内存是在堆分配的

静态内存不可以跨函数访问:

通俗说就是:当被调用的函数结束后,被调用函数里面的静态内存不能被其他函数访问。

#include <stdio.h>
#include <stdlib.h>void f(int **q)
{int i = 10;//*q等价于p  q和**q都不等价于p//*q =i;//error 因为*q = i等价于p = i;这样写是错误的*q = &i;   //等价于 p = &i;
}int main()
{int *p;f(&p);printf("%d\n",*p);	//本语句语法没有问题,但是逻辑上有问题system("pause");return 0;
}

输出结果:

10

这个程序运行是能正常输出的,但是程序是错误的,逻辑上有错误。

因为当 f( ) 函数执行完毕之后,函数终结(也就是函数的出栈),此时函数静态分配的变量的空间会被全部释放,静态变量的空间访问权限会还给操作系统,我们不能再对他进行读写操作。具体到这个 f( ) 函数就是 ,变量 q 没了,变量 i 没了, i 的值 10 也没有了。也可以说 p 指向 的 变量 i 的空间没了。

那么main 函数 就不能访问 i 的值,也就是 printf("%d\n",*p) 中的 *p 逻辑上是不可以的。

但是 指针P 可以存放着 i 的地址。但是不能访问 i 的空间,没有权限进行读写操作。

动态内存跨函数访问:

malloc堆分配的动态内存,不会随着函数的结束而被释放,只有手动free才会被释放

#include <stdio.h>
#include <stdlib.h>void f(int **q)
{*q = (int *)malloc(sizeof(int));  //等价于 p=(int *)malloc(sizeof(int)) //q = 10;    //error//*q = 10;   //等价于  p = 10;**q = 10;    //等价于 *p = 10;
}int main()
{	int *p = (int *)malloc(4);f(&p);    printf("*p = %d\n",*p);system("pause");return 0;
}

输出结果:

*p = 10

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

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

相关文章

视频专辑:JAVA语言入门视频教程

为什么80%的码农都做不了架构师&#xff1f;>>> 专辑&#xff1a;JAVA语言入门视频教程 简介:该视频专辑是java的入门教程&#xff0c;适合初学者学习java&#xff0c;讲的也非常容易懂&#xff0c;希望能给想学习java的朋友一些帮助。 1 JAVASE 01 简介 2013-10…

HTML5之webSocket使用

webSocket是什么 webSocket是HTML5新出的一种协议&#xff0c;底层是基于TCP/IP协议的。跟http没有关系&#xff0c;只是复用了http握手通道&#xff0c;用来升级协议。 webSocket的作用 轮询&#xff1a;客户端以一定的时间间隔向服务端发出请求&#xff0c;以频繁请求的方式来…

mysql5.7.17的linux安装,linux下mysql5.7.17最新稳定版本安装教程

通过源码在linux上安装mysql最新稳定版本&#xff1a;mysql-5.7.17为了方便安装过程中不受boost依赖的影响&#xff0c;直接从官网下载mysql-boost-5.7.17.tar.gz版本。(官方解释&#xff0c;编译过程中需要boost,但实际没有用到。)安装目录&#xff1a;启动脚本&#xff1a;/e…

Linux 常用命令学习

参考&#xff1a;Linux 常用命令学习 网址&#xff1a;https://www.runoob.com/w3cnote/linux-common-command-2.html 目录1、ls命令2、cd 命令3、pwd 命令4、mkdir 命令5、rm 命令6、rmdir 命令7、mv 命令8、cp 命令9、cat 命令10、more 命令11、less 命令12、head 命令13、ta…

视频专辑:Servlet视频教程

为什么80%的码农都做不了架构师&#xff1f;>>> 专辑&#xff1a;Servlet视频教程 简介:郭宏志 Servlet视频教程 1 郭宏志 Servlet 01 WEB工程结构 2013-10-26 00:32 | 播放(9) | 评论(0) | 时长:28:39 2 郭宏志 Servlet 02 Servlet简介 2013-10-26 00:31 …

阅读【现代网络技术 SDN/NFV/QOE 物联网和云计算】 第一章

本人打算阅读这本书来了解物联网和云计算的基础架构和设计原理。特作笔记如下&#xff1a; 作者&#xff1a; William Stallings 本书解决的主要问题&#xff1a; 由单一厂商例如IBM向企业或者个人提供IT产品和服务&#xff0c;包括计算机软件&#xff0c;硬件&#xff0c;通信…

python items函数用法,Python中dictionary items()系列函数的用法实例

本文实例讲述了Python中dictionary items()系列函数的用法&#xff0c;对Python程序设计有很好的参考借鉴价值。具体分析如下&#xff1a;先来看一个示例&#xff1a;import html # available only in Python 3.xdef make_elements(name, value, **attrs):keyvals [ %s"%…

SVN安装部署

svn安装版本用的是1.8 SVN属于功能性软件&#xff0c;yum安装即是最佳实践。 安装svn yum install subversion 检查svn是否安装完毕 [rootmysql ~]# rpm -qa subversion subversion-1.6.11-15.el6_7.x86_64 卸载原来svn yum remove subverson 设置svn1.8安装源 vim /etc/yum.re…

你可能不知道的跨域解决方案

出于浏览器的同源策略&#xff0c;我们经常会遇到浏览器跨域的问题。 简单的说跨域基本解决方案是&#xff1a; GET请求用JSONP其他请求用同源iframe做代理JSONP的介绍很多&#xff0c;这里就不多说了。 而同源iframe做代理主要是主窗口与iframe的通讯问题&#xff0c;因为这里…

基于wemos D1的无线遥控灯(433m无线模块)

参考&#xff1a;基于wemos D1的无线遥控灯(433m无线模块) 作者&#xff1a;一只小阿大:) 发布时间&#xff1a; 2021-04-16 09:25:53 网址&#xff1a;https://blog.csdn.net/qq_44610809/article/details/115747714 项目软硬件平台及开发环境 1.硬件平台 开发板&#xff1a…

Linux实战教学笔记37:企业级Nginx Web服务优化实战(上)

一&#xff0c;Nginx基本安全优化 1.1 调整参数隐藏Nginx软件版本号信息 一般来说&#xff0c;软件的漏洞都和版本有关&#xff0c;这个很像汽车的缺陷&#xff0c;同一批次的要有问题就都有问题&#xff0c;别的批次可能就都是好的。因此&#xff0c;我们应尽量隐藏或消除Web服…

php debug用什么意思,phpdebug_backtrace()函数是干什么的?

定义和用法PHP debug_backtrace() 函数生成一个 backtrace(回溯信息)。该函数返回一个关联数组。下面是可能返回的元素&#xff1a;名称类型描述function字符串当前的函数名。line整数当前的行号。file字符串当前的文件名。class字符串当前的类名object对象当前对象。type字符串…

探索云计算、大数据的特色化应用之路

云计算与大数据是当前最热门的两个话题&#xff0c;除了技术上的相关性以外&#xff0c;两者现在都面临同一个问题&#xff0c;就是如何更快更好地落地&#xff0c;也就是将云计算、大数据所代表的新技术、新业务模式与行业用户的实际需求紧密结合起来&#xff0c;驱动企业业务…

树莓派摄像头使用Motion监测人物动作

更多干货推荐可以去牛客网看看&#xff0c;他们现在的IT题库内容很丰富&#xff0c;属于国内做的很好的了&#xff0c;而且是课程刷题面经求职讨论区分享&#xff0c;一站式求职学习网站&#xff0c;最最最重要的里面的资源全部免费&#xff01;&#xff01;&#xff01;点击进…

ARM(IMX6U)ARM Cortex-A7中断系统(GPIO按键中断驱动蜂鸣器)

参考&#xff1a;Linux之ARM Cortex-A7 中断系统详解 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-09-16 16:07:22 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/108290225 目录1、中断是什么2、回顾STM32中断系统2.1、中断向量表(对应的…

linux php cli 太多,【linux】php cli 处理能力到底有多强?

场景描述&#xff1a;client(单片机) — send MQ —> MQ Server — Received —> php脚本(业务 DB)文字说明&#xff1a; 就是简单的一种MQ应用场景问题描述:(一说到这就想骂人)暂且80个client(听说后期5000的量), 4个PHP脚本处理进程才应付得过来。正常情况下&#xff…

测试——设计思维之获取反馈

获取用户反馈 为什么要测试&#xff1f; 尽早的从用户&#xff0c;干系人&#xff0c;专家那边获得反馈&#xff0c;能够迭代改善通过测试能够知道我们的主意设想的强项和弱势早失败如何测试&#xff1f; 让原型自己说话不要为自己的想法狡辩&#xff0c;原型是给用户&#xff…

Idea 设置Eclipse快捷键(常用)

使用Idea不习惯&#xff0c;特此将其配置成Eclipse风格的。 1、选择Eclipse风格&#xff0c;选择copy一份&#xff0c;可以自己重命名。 2、设置生成快捷键的快捷键&#xff08;例如&#xff1a;Eclipse中的Alt/&#xff09; 3、设置main函数快捷键&#xff08;补充&#xff1a…

php oracle视图,Oracle v$database视图分析

GUARD_STATUS&#xff1a;防止数据库修改的状态(可能为all或者none或者standby) SUPPLEMENTAL_LOG_DATA_MIN&#xff1a; SUPPLEMENTAL_LOG_DATA_PK&#xff1a;SQL> desc v$database名称 是否为空? 类型----------------- -------- ------------DBID NUMBERNAME VARCHAR2(…

精确JS乘除法

//说明&#xff1a;javascript的乘法结果会有误差&#xff0c;在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。function accMul(arg1,arg2) {var m0,s1arg1.toString(),s2arg2.toString();try{ms1.split(".")[1].length}catch(e){}try{ms2.spli…