C语言——段管理

news2024/11/15 13:52:20

一、复习一下

1.指针的概念?

  • 存储地址的基本数据类型

2.什么是数据类型?

  • 在内存空间上框出一定空间的模子,比如int在内存空间上框出4个字节,int就是基本的数据类型

3.基本数据类型,多个数据类型,多个同样的基本数据类型?

  • 基本数据类型:类似于int,float,char等,c语言内部已经定义好(包括大小和名字)的模子
  • 多个数据类型:有多个基本数据类型组成的连续空间,比如struct结构体
  • 多个同样的数据类型:多个同样的基本数据类型组合成的连续空间,c语言认为这是数据结构要研究的东西,不属于c语言的研究范围,所以c里面没有这个概念。
  • 这里涉及到一个概念叫语法糖,编译器帮程序员封装好的一些内存访问和内存设计的行为。

二、数组

1.定义: 多个同样数据类型组成的连续空间。

  • 数组名是首地址标记,标签,是地址常量,不能被赋值,只能初始化。
  • 数组不是动态生成的,而是程序一旦编译好后,就已经固定的

2.初始化和赋值:数据一旦初始化便不可以改变,赋值可以改变数据

    //赋值
    int arr[3];
    arr={10,20,30};//赋值{}常量空间、连续空间的语法糖
    //初始化
    int arr[3]={10,20,30};

3.默认和重载:相同的东西在不同的语境下表达的意思不同,比如运算符“+”的默认和重载,在默认语境下是数学意义上的加法(默认),在字符串语境下是字符串的连接(重载)。

int a=10+b;//加法行为  默认定义好的 c语言
           //运算符重载  用户自定义  c++

?4.约束空间的结束标志(字符,非字符):

  • 字符连续空间:0  双引号" "自带一个结束标志0。
  • void test03(){
        int a=0x616263;
        printf("%x\n",a);
        //字符连续空间
        // 无结束标志
        char b[]={[0]=0x64,[1]='c',[2]='b',[3]='a'};//没有结束标志,输出dcbacba
        printf("%s\n",b);
        //有结束标志
        char c[]={[0]=0x64,[1]='c',[2]='b',[3]='a',[4]=0};//有结束标志,输出dcba
        printf("%s\n",c);
    }

  • 非字符连续空间:读到0时不会停止,但必须要有长度。比如读取xls文件时,遇到0并不会停止读取数据,但xls 文件有长度限制。

5.为什么需要约束空间的结束标志?

  • c语言一旦知道了地址就可以任意访问,为了保证数据的正常访问,需要约束空间的结束标志。

6.C语言的维护连续空间的方法(字符,非字符):

字符连续空间   按照字节逐一处理,并且由语言来约定结束标志是0
非字符连续空间  按照任意长度来处理,结束标志没有要求,但必须约定长度

7.strcpy和memcpy:

  • strcpy():是字符类型连续空间,有两个参数,没有长度参数
  • memcpy(): 非字符类型连续空间,有三个参数,有长度参数(即约束空的间的结束标志)

8.C语言就是玩内存,内存管理大师

9.sizeof大小:

int a,b,c;
struct abc a1,a2,a3;

int c[5];     sizeof(c)=20 //所有int元素的大小5*4    
              sizeof(c[2])=4//一个int元素的大小
              sizeof(c+2)=8 //首地址偏移2个元素地址后的地址的大小
 
int *d;       sizeof(*d)=8//指针(即地址)的大小,一般是4位或8位,由操作系统决定


//写成代码
test06(){ 
int c[5];
int *d;
//指针(即地址)的大小,一般是4位或8位,由操作系统决定
printf("c: %p\n", (void*)&c); // 打印数组c的地址
printf("c[2]: %p\n", (void*)&c[2]); // 打印数组c中第三个元素的地址
printf("c+2: %p\n", (void*)(c+2)); // 打印数组c首地址偏移2个int元素后的地址
printf("*d: %p\n", (void*)d); // 打印指针d指向的地址的内容

printf("Size of c: %zu\n", sizeof(c)); // 打印数组c的大小
printf("Size of c[2]: %zu\n", sizeof(c[2])); // 打印数组c中第三个元素的大小
printf("Size of c+2: %zu\n", sizeof(c+2)); // 打印数组c首地址偏移2个int元素后的大小
printf("Size of *d: %zu\n", sizeof(*d)); // 打印指针d指向的地址的内容的大小
}

10.?sizeof和strlen():

  • sizeof():是字符类型连续空间的关键词,
  • strlen():是非字符类型连续空间的函数,

三、内存的分段管理

1.经典的段错误(面试的时候可能会问到):

#include<stdio.h>

//经典段错误
void test01(){
    char s[]="abcd";
    //char*s="abcd";//经典段错误
    s[1]='1';
    printf("%s\n",s);//输出a1cd

    //*(s+1)和s[1]是一个意思
    *(s+1)='1';
    printf("%s\n",s);//输出a1cd
}

int main(){
    test01();

    return 0;
}

2.越界访问就是段错误

3.分段

  • 只读段:存储常量,代码,函数。只要程序不终止,永远存在。
  • 读/写段:存储全局变量。只要程序不终止,永远存在。
  • 段:

4.func1和func2的例子:

//典型错误
int *func1(){
    int abc;//abc进栈
    return &abc;//返回abc的时候, abc的地址已经还给系统(可以理解为,abc去别的地方了)
//此时&abc,取到的地址实际上已经不是abc的地址了
//return &abc可以理解为,abc的地址换了,但还是用原来的地址去找abc,所以找不到很正常)
}

//正确的例子
int *func2(){
//用malloc从堆区申请100字节,将首地址传给p
    int *p=malloc(100);
    return p;//返回p时,虽然p的地址返已经还给系统,
//但p传给函数的是malloc的首地址(不是变量*p的地址),
//而malloc此时还在,所以函数可以接收到malloc的地址
}

5.内存泄漏与内存溢出(面试时可能会问到):

  • 内存泄漏:变量内存被释放后,越界访问变量地址。一直执行程序,没有释放内存
  • char *rec=func2();//申请内存
        rec[x]=xxxxxxx;//利用内存
        free(rec);//释放内存,如果一直不释放内存就会造成内存泄漏

  • 内存溢出:
    网卡传递消息
    用户能接收的消息大小: char buf[10] //大小为10B
    通过函数传递消息:     ssize_t recv(参数1,void *buffer,参数2, 参数3,参数4)
    网卡要传递的消息大小: 200B
    
    这种情况下,网卡传递消息给用户,就形成了内存溢出

6.分段管理:每个段都有自己的权限,由操作系统分配:

  • 一旦应用程序非法访问某个段,os(操作系统)就会终止这个程序,并抛出“segmentation fault”错误

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

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

相关文章

SpringCloud 微服务消息队列灰度方案 (RocketMQ 4.x)

目录 背景遇到的问题 RocketMQ 基础基础消息模型扩展后的消息模型部署模型相关概念点 方案对比影子Topic的方案Tag的方案UserProperty的方案影子Group的方案灰度分区的方案方案对比 灰度分区方案设计适配只有部分灰度的情况所做的功能扩展消费者&#xff08;无灰度&#xff09;…

YOLOv8改进,YOLOv8结合DynamicConv(动态卷积),CVPR2024,二次创新C2f结构

摘要 大规模视觉预训练显著提高了大规模视觉模型的性能。现有的低 FLOPs 模型无法从大规模预训练中受益。在本文中,作者提出了一种新的设计原则,称为 ParameterNet,旨在通过最小化FLOPs的增加来增加大规模视觉预训练模型中的参数数量。利用 DynamicConv 动态卷积将额外的参…

【C++】在windows下配置一个小巧实用的C/C++调试环境

目录 1.准备环境 2.cgdb 3. gdb-dashboard 4.常用命令 4.1 cgdb命令 4.2 gdb常用命令 虽然在大部分常用的C/C编辑器中&#xff0c;调试功能已经很方便且完善&#xff0c;但是&#xff0c;如果你还需要一个小巧一点&#xff0c;调试信息还完善的调试环境的&#xff0c;可以…

Dolby TrueHD和Dolby Digital Plus (E-AC-3)编码介绍

文章目录 1. Dolby TrueHD特点总结 2. Dolby Digital Plus (E-AC-3)特点总结 Dolby TrueHD 与 Dolby Digital Plus (E-AC-3) 的对比 Dolby TrueHD和Dolby Digital Plus (E-AC-3) 是两种高级的杜比音频编码格式&#xff0c;常用于蓝光影碟、流媒体、影院等高品质音频传输场景。它…

k8s上部署redis高可用集群

介绍&#xff1a; Redis Cluster通过分片&#xff08;sharding&#xff09;来实现数据的分布式存储&#xff0c;每个master节点都负责一部分数据槽&#xff08;slot&#xff09;。 当一个master节点出现故障时&#xff0c;Redis Cluster能够自动将故障节点的数据槽转移到其他健…

计算机网络——路由选择算法

路由算法 路由的计算都是以子网为单位计算的——找到从原子网到目标子网的路径 链路状态算法

4.3 Java JNI 机制

1 绪论 JNI 是一个原生编程接口。它允许在 Java 虚拟机&#xff08;JVM&#xff09;内运行的 Java 代码与用其它编程语言&#xff08;如 C、C 和汇编&#xff09;编写的应用程序和库进行互操作。 JNI 最重要的好处是它对底层 JVM 的实现没有限制。因此&#xff0c;JVM 供应商可…

influxDB 时序数据库安装 flux语法 restful接口 nodjsAPI

安装 Install InfluxDB | InfluxDB OSS v2 Documentation Debian和Ubuntu用户可以用apt-get包管理来安装最新版本的InfluxDB。 对于Ubuntu用户&#xff0c;可以用下面的命令添加InfluxDB的仓库&#xff0c;添加之后即可apt-get 安装influxdb2 wget -q https://repos.influx…

7z 解压器手机版与解压专家:安卓解压工具对决

7z 解压器手机版和解压专家都是在安卓设备上广受欢迎的解压软件。7z 解压器手机版由深圳乡里云网络科技有限公司开发&#xff0c;大小为 32.8M&#xff0c;支持多种常见的压缩文件格式&#xff0c;如.zip、.rar、.7z 等。 它对安卓操作系统的特性和用户习惯进行了优化&#xf…

亮数据——助力全球数据抓取的高效代理平台

目录 实际案例&#xff1a;利用代理服务抓取企业信息完整代码运行结果 亮数据的技术优势与应用场景产品更新&#xff1a;简化注册流程与智能助手升级立即注册&#xff0c;开启您的数据抓取之旅&#xff01; 在如今的大数据时代&#xff0c;企业决策越来越依赖于数据分析&#x…

设计模式之责任链模式(Chain Of Responsibility)

一、责任链模式介绍 1、责任链模式介绍 职责链模式(chain of responsibility pattern) 定义: 避免将一个请求的发送者与接收者耦合在 一起&#xff0c;让多个对象都有机会处理请求。将接收请求的对象连接成一条链&#xff0c;并且沿着这条链 传递请求&#xff0c;直到有一个对…

【月之暗面kimi-注册/登录安全分析报告】

前言 由于网站注册入口容易被机器执行自动化程序攻击&#xff0c;存在如下风险&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露&#xff0c;不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 &#xff0c;造成用户无法登陆、注册&#xff0c;大量收到垃圾短信的…

低代码牵手 AI 接口:开启智能化开发新征程

一、低代码与 AI 接口的结合趋势 低代码开发平台近年来在软件开发领域迅速崛起。随着企业数字化转型的需求不断增长&#xff0c;低代码开发平台以其快速构建应用程序的优势&#xff0c;满足了企业对高效开发的需求。例如&#xff0c;启效云低代码平台通过范式化和高颗粒度的可配…

安培环路定理

回忆 静电场中的回路定理&#xff1a;→静电场是保守场 安培环路定理 1、圆形回路包围无限长载流直导线 &#xff08;1&#xff09;回路逆时针 &#xff08;2&#xff09;回路顺时针 规定&#xff1a; 回路正向由右手螺旋定则判断&#xff08;根据回路绕行方向&#xff0c;…

IDEA 2024.3正式版发布,速览新功能!

0 前言 IntelliJ IDEA 2024.3 引入了一系列可以提升您的开发体验的强大新功能。 IDE 现在提供代码逻辑结构的表示&#xff0c;简化了 Kubernetes 应用程序的调试体验&#xff0c;引入了集群范围的 Kubernetes 日志访问。 1 关键亮点 1.1 Structure工具窗口中的 Logical代码结…

LabVIEW 实现 find_nearest_neighbors 功能(二维平面上的最近邻查找)

1. 背景介绍 在数据分析和图像处理领域&#xff0c;经常需要查找给定点的最近邻居点。在LabVIEW中&#xff0c;计算二维平面上多个点之间的欧氏距离&#xff0c;并返回距离最近的几个点是一种常见操作。find_nearest_neighbors 函数用于实现这个功能。 2. 欧氏距离计算 在二维…

LeetCode 单调栈 下一个更大元素 I

下一个更大元素 I nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。 给你两个 没有重复元素 的数组 nums1 和 nums2 &#xff0c;下标从 0 开始计数&#xff0c;其中nums1 是 nums2 的子集。 对于每个 0 < i < nums1.length…

vue的组件使用

1.安装element plus组件库 npm install element-plus --save

2024-11-14 算法学习及论文辅导(每日更新,随时联系)

看看学习小群的学习氛围&#x1f447;&#x1f3fb; 很多同学自己学习遇到问题没人解决&#xff0c;最终消耗了时间&#xff0c;精力同时大大消耗了自己对学习的信心&#x1f627; &#x1f973;来看看跟班学习&#xff0c;大家遇到问题的时候是怎么解决的&#xff1a; 首先…

开源三代示波器的高速波形刷新方案开源,支持VNC远程桌面,手机,Pad,电脑均可访问(2024-11-11)

说明&#xff1a; 1、本来这段时间是一年一度Hackaday硬件设计开源盛宴&#xff0c;但hackaday电子大赛在去年终结了。所以我开源个我的吧。 2、三代示波器的高速波形刷新方案&#xff0c;前两年就做好了&#xff0c;这两年忙H7-TOOL的更新比较多&#xff0c;三代示波器的更新…