从C出发 30 --- 指针与堆空间

news2024/7/6 20:10:05

数组 就是变量的有序集,因此只有可以动态的创建一个变量,就可以动态的创建多个变量了,

堆空间就是一片内存区域,用于动态创建内存变量的区域

 

 

void 类型是基础类型,不是基础数据类型,为什么?因为没有办法 使用  void 类型创建一个变量,   

void  只能用来声明一个函数没有返回值,或者没有参数,除此之外没有别的用处了 ?

        错觉  ,  可以使用void 类型,来扩展成这样的指针类型    void*  

如果我们希望从一个指针从内存当中取数据,必须知道取多少字节的数据

假设  int* p   (每次读内存的时候,读4个字节的数据),将四个字节内存中的数据拿出来,当作一个整型使用

 

如果  p   是这样的类型     void* p ? 

可以保存起始地址,但是却没有办法读具体的数据了,因为 void 无长度信息,

void*  是一个合法的指针类型,但是却无法用  void*  类型的指针  来访问具体的内存数据,

因为   p   是 void*  类型的指针,意味着这种类型的指针,它可以保存任意类型的地址,因为这里的赋值语句都是正确的

 

printf("&f\n", *p)  这种写法错误,因为不可能使用 void* 类型的指针来访问内存中的数据,因为void 类型不具备长度信息,

char 代表的长度信息是 1 字节,int 4 字节, float 4 字节, double 8字节,所以这些基础的数据类型所扩展出来的指针,都能够访问数据出来,而void 不具备长度信息,没有办法使用void 扩展出来的指针去访问内存中的数据

编译器没有错误,意味着,这 4 条语句都是合法的

 使用  p  指针访问内存中的数据?

出现错误,表示 不能够使用 void* 类型的指针,去访问内存中的数据

如果非要访问内存中的数据怎么办?

 

 

赋值符号左右两边的类型不一样  不同的指针类型

编译结果告诉我们这里有问题, 所以,具体数据类型的指针之间,不能够相互的乱赋值,void*是一个特殊的类外


 void*   代表一个地址 ,这个地址就是我们所申请的内存的起始地址,

怎么归还,调用 free函数, 将之前申请到的内存的起始地址作为参数,调用 free 函数,就可以了

参数的这个  p  指针 所代表的地址,必须是堆空间中的地址,

如果非要用一个全局数据区里面的地址调用free,或者用一个栈空间区里面的地址调用free, 程序在后面的运行中会崩溃,free  所要释放的是堆空间

这里定义了一个指针  p , 这个指针 p 想要指向 int 类型的变量,具体指向哪个int 类型变量,p 是指向了堆空间里面的 4 个字节,换句话说,p 指向了int 类型的变量存在于 堆空间中,

*p = 100;    把 p 所指向的堆空间里面的 4 个字节 赋值为 100,将4 个字节的堆空间当成一个 int 来使用

 

 编译无误意味着这里的申请成功了,我们拿到了4 个字节的堆空间,并把这 4 个字节的堆空间当作int 类型的变量来使用

malloc -- -- -- -- 从堆空间里面申请内存,申请16 字节的内存,就是想申请 4 个int 类型的变量,换句话说这里想申请一个数组,这个数组存在于堆空间当中,这个数组里面有4 个int ,起始地址被 p 所指向,

 申请堆空间之后,如果不再使用了,必须归还

 

如果申请结果为 NULL (空),证明堆空间已经耗尽了

多次释放申请到的内存,会导致程序运行不稳定

 


malloc  申请到的东西只是这一片内存的起始地址,所以返回值是 void* 类型

 

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

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

相关文章

MySQL --- 图形化工具DDL表结构操作

一. 图形化工具 1. 介绍 前面学习了DDL中关于数据库操作的SQL语句,在编写这些SQL时,都是在命令行当中完成的。在命令行当中来敲这些SQL语句很不方便,主要的原因有以下 3 点: 没有任何代码提示。(全靠记忆&#xff0…

行为型模式-备忘录模式

备忘录模式 概述 备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原,很多软件都提供了撤销(Undo&#xff0…

【自动化测试】Appium环境设置

启动Appium需要的环境配置有些复杂,这里将需要的环境配置整理出来,附上博主亲测有效的教程,有些教程有一点点老了,博主也做了备注,并且有些老一点步骤,博主根据现有的情况做了新的图文教程,大家…

近源渗透学习

一、近源渗透 近源渗透测试是网络空间安全领域逐渐兴起的一种新的安全评估手段。 它是一种集常规网络攻防、物理接近、社会工程学及无线电通信攻防等能力于一体的高规格网络安全评估行动。网络安全评估小组在签订渗透测试授权协议后,通过乔装、社工等方式实地物理侵…

微服务体系

目录 结构服务注册中心EurekaZookeeperConsul上面三者的对比 Ribbon 负载均衡负载均衡OpenFeign 远程服务调用Hystrix服务熔断常见的设置 Hystrix 工作流程Hystrix-DashBoard 的使用 SpringCloud Gateway核心工作流程 SpringCloud Config 分布式配置中心bootstrap.yml配置文件 …

独立按键识别

项目文件 文件 关于项目的内容知识点可以见专栏单片机原理及应用 的第四章 IO口编写 参考图电路编写程序,要求实现如下功能: 开始时LED均为熄灭状态,随后根据按键动作点亮相应LED(在按键释放后能继续保持该亮灯状态,直至新的按键压下时为止…

【实用工具】SpringBoot实现接口签名验证

需求场景 由于项目需要开发第三方接口给多个供应商,为保证Api接口的安全性,遂采用Api接口签名验证。 Api接口签名验证主要防御措施为以下几个: 请求发起时间得在限制范围内请求的用户是否真实存在是否存在重复请求请求参数是否被篡改 项目…

java8新特性——StreamAPI

1.集合处理数据的弊端 当我们在需要对集合中的元素进行操作的时候,除了必需的添加,删除,获取外,最典型的操作就是集合遍历。 package com.wxj.streamapi;import java.util.ArrayList; import java.util.Arrays; import java.uti…

E. Vasya and Good Sequences(异或)

Problem - E - Codeforces Vasya有一个由n个整数组成的序列a。 Vasya可以执行以下操作:从序列中选择一些数字,并交换其二进制表示中的任意一对位。例如,Vasya可以将数字6(… 000000001102)转换为3(… 00000…

[数据库系统] 一、外键约束 (educoder)

1.任务:给表添加外码。 2.相关知识 需要掌握: (1)什么是外码; (2)怎么给表添加外码。 (1)什么是外码 外部关键字 外码是另一张表中的主码。**外码的主要作用是保持数据的一致性,完整性。 如图有两张表,classId 是T…

蓝晓转02上市价格预测

蓝晓转02 基本信息 转债名称:蓝晓转02,评级:A,发行规模:5.460645亿元。 正股名称:蓝晓科技,今日收盘价:88.16元,转股价格:92.73元。 当前转股价值 转债面值 …

10.集合

1.泛型 1.1泛型概述 泛型的介绍 ​ 泛型是JDK5中引入的特性&#xff0c;它提供了编译时类型安全检测机制 泛型的好处 把运行时期的问题提前到了编译期间避免了强制类型转换 泛型的定义格式 <类型>: 指定一种类型的格式.尖括号里面可以任意书写,一般只写一个字母.例如:…

深度学习模型部署的步骤和相关注意事项

文章目录 深度学习模型部署的步骤和相关注意事项什么是模型部署&#xff1f;步骤1&#xff1a;选择合适的部署环境步骤2&#xff1a;选择合适的部署框架步骤3&#xff1a;将模型转换为部署格式步骤4&#xff1a;创建API接口步骤5&#xff1a;部署模型总结 深度学习模型部署的步…

JWT漏洞基础

JWT漏洞基础 什么是JWTJWT漏洞介绍工具使用 身份认证(Authentication)又称鉴权&#xff0c;是指通过一定的手段&#xff0c;完成对用户身份的确认。认证的方式&#xff1a;sessioncookie、JWT、Token session认证的局限性 session认证机制需要配合cookie才能实现。由于cookie默…

极客时间- 数据结构与算法之美 - 王争 前 Google 工程师【学习笔记】

本文是 极客时间- 数据结构与算法之美 - 王争 前 Google 工程师。专栏学习笔记整理&#xff0c;课程链接&#xff1a;https://time.geekbang.org/column/intro/100017301?tabcatalog 01 | 为什么要学习数据结构和算法&#xff1f;面试业务开发工程师写出达到开源水平的框架才是…

大数据应用案例:如何在金融行业中利用数据挖掘实现风险控制和预测

引言 随着互联网和移动技术的发展&#xff0c;金融行业已经进入了数字化时代。大数据技术在金融行业的应用越来越广泛&#xff0c;其中最重要的应用就是风险控制和预测。本文将介绍如何利用数据挖掘技术在金融行业中实现风险控制和预测&#xff0c;以及一些成功的案例。 章节…

Android 系统的分区和文件系统(4)- Android 伪文件系统

声明 Android系统中有很多分区&#xff0c;每个分区内的文件系统一般都不同的&#xff0c;使用ADB进入系统/目录下可发现挂载这很多的目录&#xff0c;不同的目录中可来自不同的分区及文件系统&#xff1b;此篇参考了一些书籍及论文&#xff0c;仅供学习使用。只介绍大概理论&…

Valarrays

C标准库提供了一个class valarray用以进行数值数组的运算。 它声明于头文件<valarray> namespace std{template<class T> class valarray; //numeric array of type Tclass slice;template<class T> class slice_array; //slice out of a valarrayclass gs…

Java经典笔试题—day03

Java经典笔试题—day03 &#x1f50e;选择题&#x1f50e;编程题&#x1f95d;字符串中找出连续最长的数字串&#x1f95d;数组中出现次数超过一半的数字 &#x1f50e;结尾 &#x1f50e;选择题 (1)以下代码运行输出的是 public class Person{private String name "Pe…

怎么洗稿容易过稿-在线洗稿软件

自媒体洗稿软件 即使您是一位优秀的自媒体写作人员&#xff0c;也难免遇到让人头疼的撰写问题&#xff0c;例如无法处理大量原始文本、需要手动删除冗余信息、缺少时间针对每篇文章进行深入修改等问题。但是&#xff0c;现在有了我们的一款自媒体洗稿软件&#xff0c;您再也不需…