linux学习:内存(栈,堆,数据段,代码段)

目录

内存

栈内存

堆内存 

数据段

代码段

注意

例子


内存

Linux 操作系统为了更好更高效地使用内存,将 实际物理内存进行了映射,对应用程序屏蔽了物理内存的具体细节,有利于简化程序的编写 和系统统一的管理。

假设你正在使用的计算机实际物理内存只有 1GB 大小,而当前 系统运行了三个进程,Linux 会将 PM 中的某些内存映射为三个大小均为 4GB 的虚拟内存 ,让每个进程都以为自己独自拥有了完整的内存空间,这样极大地方 便了应用层程序的数据和代码的组织,

栈内存

栈内存以下简称栈

是从 0xC000 0000 往下增长的这部分内存区域,之所以 被称为“栈”是因为进程在使用这块内存的时候是严格按照“后进先出”的原则来操作的, 而这种后进先出的逻辑,就被称为栈

栈会随着进程的运行而不断 发生变化:一旦有新的函数被调用,就会立即在栈顶分配一帧内存,专门用于存放该函数内 定义的局部变量(包括所有的形参),当一个函数执行完毕返回之后,他所占用的那帧内存 将被立即释放

栈主要就是用来存储进程执行过程中所产生的局部变量的,当然为了可以实现函数的嵌 套调用和返回,栈还必须包含函数切换时当下的代码地址和相关寄存器的值,这个过程被称 为“保存现场”,等被调函数执行结束之后,再“恢复现场”。因此,如果进程嵌套调用了 很多函数,就会导致栈不断增长,但是栈的大小又是有一个最大限度的,这个限度一般是 8MB,超过了这个最大值将会产生所谓的“栈溢出”导致程序崩溃,所以我们在进程中不 宜嵌套调用太深的函数,也不要定义太多太大的局部变量

堆内存 

堆内存(以下简称堆)是一块自由内存,原因是在这个区域定义和释放变量完全由你来 决定,即所谓的自由区。堆跟栈的最大区别在于堆是不设大小限制的,最大值取决于系统的 物理内存。 跟栈一样,会随着进程的运行而不断地增大或缩小

数据段

数据段实际上分为三部分,地址从高到底分别是.bss 段、.data 段和.rodata 段,三个 数据段各司其职:.bss 专门用来存放未初始化的静态数据,它们都将被初始化为 0,.data 段专门存放已经初始化的静态数据,这么初始值从程序文件中拷贝而来,而.rodata 段用来 存放只读数据,即常量,比如进程中所有的字符串、字符常量、整型浮点型常量等。

代码段

代码段实际上也至少分为两部分:.text 段和.init 段。.text 段用来存放用户程序代码, 也就是包括 main 函数在内的所有用户自定义函数,而.init 段则用来存储系统给每一个可 执行程序自动添加的“初始化”代码,这部分代码功能包括环境变量的准备、命令行参数的 组织和传递等,并且这部分数据被放置在了栈底。

注意

  • 栈中的环境变量和命令行参数在程序一开始运行之时就被固定在了栈底(即紧挨着 内核的地方),且在进程在整个运行期间不再发生变化,假如进程运行时对环境变量的个数 或者值做了修改,则为了能够容纳修改后的内容,新的环境变量将会被拷贝放置到堆中。
  • 栈和堆都是动态变化的,分别向下和向上增长,大小随着进程的运行不断变大变小
  • 静态数据指的是:所有的全局变量,以及 static 型局部变量。
  • 数据段的大小在进程一开始运行就是固定的,其中.rodata 存放程序中所有的常 量,.data 存放所有的静态数据,而如果静态数据未被初始化,则程序刚开始运行时系统将 会自动将他们统统初始化为 0 然后放置在.bss 段中,这么做的原因是要节省磁盘存储空间: 由于未初始化的静态数据在运行时一概会被初始化为 0,因此在程序文件中就没有必要保存 任何未初始化的变量的值了。

堆内存被称为内存中的自由区,这是一个非常重要的区域,因为在此区域定义的内存的 生命周期我们是可以控制的,

堆内存的生命周期是:从 malloc( )/calloc( )/realloc( )开始,到 free( )结束,其分 配和释放完全由我们开发者自定义,这就给了我们最大的自由和灵活性,让程序在运行的过 程当中,以最大的效益使用内存

头文件#include <stdlib.h>

  • void *malloc(size_t size)
    • 在堆中申请一块大小为 size 的连续的内存
    • size:对内存大小(字节)
    • 返回新申请的内存基地址
  • void *calloc(size_t n,size_t size)
    • 在堆中申请一个具有 n 个元素的匿名数组,每个元素大小为 size
    • 返回新申请的内存基地址
  • void *realloc(void *ptr, size_t size);
    • 将 ptr 所指向的堆内存大小扩展为 size
    • 返回扩展后的内存的基地址
    • 返回的基地址可能跟原地址 ptr 相同,也可能不同(即发生了迁移)
    • 当 size 为 0 时,该函数相当于相当于 free(ptr);
  • void free(void *ptr);
    • 将指针 ptr 所指向的堆内存释放
    • free(p)释放 p 所指向的堆内存,但是并不会改变 p 本身的值,也就是说释放了之后 p 就变成了一个野指针了,下次要引用指针 p 必须对他重新赋值

例子

#include <stdlib.h>
#include <stdio.h>
int *heap_array(int *old_ptr,int n);
void show_value(int *ptr);
int main(void)
{int n, *p = (int *)malloc(1 * sizeof(int));p[0] = 1;while(1){if(scanf("%d",&n)==0)break;p= heap_array(p,n);show_value(p);}free(p);return 0;
}
int *heap_array(int *old_ptr, int n)
{int size = old_ptr[0]+1;printf("size = %d\n",size);int *new_ptr;new_ptr = (int*)realloc(old_ptr,(size * sizeof(int)));new_ptr[0]=size;printf("new_ptr[0]=%d\n",new_ptr[0]);new_ptr[size-1]=n;printf("new_ptr[%d]=%d\n",size-1,new_ptr[size-1]);return new_ptr;
}
void show_value(int* ptr)
{int i;printf("--->>>");for(i=1;i<ptr[0];i++){printf("ptr[%d]=%d",i,ptr[i]);}printf("<<<-----\n");
}

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

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

相关文章

【热门话题】OneFlow深度学习框架介绍

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 OneFlow深度学习框架介绍引言一、OneFlow概述1.1 定位与起源1.2 核心特性数据流…

Linux网络名称空间的调试方法全面分析

Linux网络名称空间是一种广泛使用的技术&#xff0c;用于隔离网络环境&#xff0c;特别是在容器化和微服务架构中&#x1f4e6;。然而&#xff0c;随着网络名称空间的广泛应用&#xff0c;开发者和系统管理员可能会遇到需要调试网络名称空间配置和性能的情况&#x1f50d;。本文…

WEB3浪潮下的全新体验:精灵派对链游引领边玩边赚的创新之旅

在当前的数字经济浪潮中&#xff0c;区块链技术以其独特的去中心化特性&#xff0c;正在逐渐改变我们的生活和工作方式。其中&#xff0c;区块链游戏&#xff08;链游&#xff09;作为新兴的领域&#xff0c;正以其独特的优势吸引着全球玩家的目光。在这样一个背景下&#xff0…

ssm“健康早知道”微信小程序

采用技术 ssm“健康早知道”微信小程序的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringMVCMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 需求分析 利用ssm、Java、MyEclipse和mysql数据库等知识点&#xff0c;结合相关设…

云卓C20,22倍变焦三轴夜视云台

云卓C20三轴云台&#xff0c;带探照灯&#xff0c;打破光线与空间束缚。具备22倍光学变焦与探照能力&#xff0c;为视觉带来新视角&#xff0c;随时捕捉高清影像&#xff0c;精准搜寻广阔区域。配备变焦高亮聚光灯&#xff0c;强化夜间作业效能与安全保障。适用于公安、电力、救…

excle如何设置自动显示星期几

目录 一.目的 二.范例结果 三.处理方式 一.目的 excle依据日期&#xff0c;设置后自动显示星期几。 二.范例结果 三.处理方式 公式1TEXT(XXX,DDDD) 公式2TEXT(XXX,DDD)

银河麒麟桌面版v10系统安装windows的exe应用-使用CrossOver安装exe软件

银河麒麟桌面版V10系统属于Linux系统&#xff0c;要想在上面运行windows系统下的exe应用是可以实现的&#xff08;理论上可以实现&#xff0c;但实际中受限系统版本&#xff0c;虚拟windows应用的软件版本等多种问题&#xff0c;在安装使用的时候&#xff0c;并不能全部成功&am…

第十届蓝桥杯大赛个人赛省赛(软件类) CC++ 研究生组2.0

A立方和 #include<iostream> #include<cmath> using namespace std; int main(){int n, t, flag, x;long long ans 0;for(int i 1; i < 2019; i){t i;flag 0;while(t && !flag){x t % 10;if(x 2 || x 0 || x 1 || x 9) flag 1;t / 10;}if(fl…

域名过期时间怎么计算?

域名是互联网上的重要标识&#xff0c;它帮助用户快速找到并访问特定的网站。为了维护域名的正常运行和避免不必要的麻烦&#xff0c;了解域名过期时间的计算和管理方式至关重要。 首先我们先来了解一下域名的各种状态及域名注册与删除周期。 通常情况下&#xff0c;英文国际域…

流媒体的安全谁来保障

流媒体的安全谁来保障 说起媒体&#xff0c;我们马上就会想到报纸新闻、广播、电视。 其实所谓的流媒体同我们通常所指的媒体是不一样的&#xff0c; 它只是一个技术名词。流媒体到底是什么&#xff1f;能给我们的生活带来什么&#xff1f;跟小德一起来看看。 流媒体是什么&a…

大数据基本名词

目录[-] 1.1. 1. Hadoop1.2. 2. Hive1.3. 3. Impala1.4. 4. Hbase1.5. 5.hadoop hive impala hbase关系1.6. 6. Spark1.7. 7. Flink1.8. 8. Spark 和 Flink 的应用场景 1. Hadoop 开源官网&#xff1a;https://hadoop.apache.org/ Hadoop是一个由Apache基金会所开发的分…

使用Android完成案例教学

目录 题目&#xff1a;完成在Android平台下2个玩家分别利用2个手机连接在同一局域网下通过滑动摇杆分别使红飞机和黄飞机移动的开发。&#xff08;全代码解析&#xff09; 题目&#xff1a;完成在Android平台下2个玩家分别利用2个手机连接在同一局域网下通过滑动摇杆分别使红飞…

解决unbuntu更新到23.10 mantic firefox无法使用的问题

产看历史版本号&#xff1a; 升级到最新版本后查看&#xff1a; roottesthost01:/home/test/Desktop# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 23.10 Release: 23.10 Codename: mantic 打开firefox发现图标找…

【教程】四种方法将App打包为IPA文件类型

摘要 本教程总结了将App应用程序打包为IPA包的四种常用方法&#xff0c;包括Apple推荐的方式、iTunes拖入方法、自动编译脚本和解压改后缀名方法。每种方法都有其特点和适用场景&#xff0c;在实际开发中可以根据需求选择合适的方式进行打包。通过本教程&#xff0c;您将了解到…

从零开始学Spring Boot系列-集成MyBatis-Plus

在Spring Boot应用开发中&#xff0c;MyBatis-Plus是一个强大且易于使用的MyBatis增强工具&#xff0c;它提供了很多实用的功能&#xff0c;如代码生成器、条件构造器、分页插件等&#xff0c;极大地简化了MyBatis的使用和配置。本篇文章将指导大家如何在Spring Boot项目中集成…

【C语言】函数递归编程题

目录 题目一&#xff1a; 题目二&#xff1a; 题目三&#xff1a; 题目四&#xff1a; 总结 题目一&#xff1a; 题目&#xff1a;接受一个整型值&#xff08;无符号&#xff09;&#xff0c;按照顺序打印它的每一位。&#xff08;递归完成&#xff09; 列如&#xff1a; …

探索 ChatGPT:解读 AI 对话的魔力(文末推荐一款AI工具聚合平台,可免费体验)

&#x1f947;作者简介&#xff1a;CSDN内容合伙人、新星计划第三季Python赛道Top1 &#x1f525;个人主页&#xff1a;hacker707的csdn博客 &#x1f4ac;推荐一款AI工具聚合平台&#x1f449;Hulu AI 探索 ChatGPT&#xff1a;解读 AI 对话的魔力 ChatGPT 的魅力如何使用 C…

JVM修炼之路【10】- 垃圾回收器和垃圾回收算法

垃圾回收算法 我们先简要看一下 四种主要的垃圾回收算法 看到这不禁感慨一下 人家1960年 都搞出GC算法了 太强了 评价标准 既然有这么多算法 那就跟各个牌子的游戏本一样 有个比较&#xff0c;这里我们重点介绍一下 垃圾回收算法的评价标准 这几个标准非常重要是 是后面理解很…

springCloudAlibaba集成sentinel实战(超详细)

一、Sentinel介绍 1. 什么是Sentinel Sentinel是阿里开源的项目&#xff0c;提供了流量控制、熔断降级、系统负载保护等多个维度来保障服务之间的稳定性。 分布式系统的流量防卫兵&#xff1a; 随着微服务的普及&#xff0c;服务调用的稳定性变得越来越重要。Sentinel以“流…

你知道 Java 线程池的原理吗?

Java线程池是用于管理和复用线程的机制&#xff0c;它可以帮助开发者有效地管理线程的生命周期和资源&#xff0c;并提高应用程序的性能和稳定性。 1. 线程池概述 在计算机科学中&#xff0c;线程池是一种可用来执行异步任务的线程队列。它主要包含以下几个组成部分&#xff…