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.tpcf.cn/news/807794.html

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

相关文章

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

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

1.8.1 卷积神经网络近年来在结构设计上的主要发展和变迁——AlexNet

1.8.1 卷积神经网络近年来在结构设计上的主要发展和变迁——AlexNet (从AlexNet到ResNet系列) AlexNet首次亮相是在2012年的ILSVRC大规模视觉识别竞赛上&#xff0c;它将图像分类任务的Top-5错误率降低到15.3%&#xff0c;大幅领先于其他传统方法。AlexNet是首个实用性很强的…

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

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

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

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

split和join的区别

split和join是Python中字符串&#xff08;string&#xff09;类型的两种常用方法&#xff0c;它们用于对字符串进行分割和合并。 1.split() 方法&#xff1a; split() 方法用于将字符串按照指定的分隔符&#xff08;如果没有指定分隔符&#xff0c;则默认为所有的空白字符&am…

C语言学习笔记day18

1. 指针基本概念 1.地址:用来区分内存中不同字节的编号 2.指针:地址就是指针,指针就是地址 3.指针变量:存储指针的变量,有时去掉变量,称为指针 2. 指针运算符 1.&: 1.获得一个变量在内存空间中的首地址 2.让表达式类型升级 2.*: 1.取…

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

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

element-ui自定义table表头,render-header使用

<el-table-column header-align="right" align="right" :render-header="renderHeader"><el-table-column prop="week" label="日期"></el-table-column><el-table-column prop="name" labe…

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

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

[html]网页结构以及常见标签用法

哎&#xff0c;我服了&#xff0c;明明之前学了html的&#xff0c;但时间一长我就忘记了&#xff0c;本来flask学到视图了&#xff0c;但涉及到了html我觉得还是需要重新回顾一下,,,,,, web开发技术栈一共有3门语言。分别是&#xff1a; HTML&#xff1a;译作超文本标记语言&am…

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

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

小程序View点击响应传递多个参数

小程序开发中&#xff0c;view的点击事件是通过bindtap绑定的&#xff0c;比如&#xff1a; <view classpay-button bindtapgotoDetail id{{item.id}}>查看详情</view> 在js文件中是这样获取参数id的&#xff1a; gotoDetail: function(e) {var id e.currentTar…

Java提供了哪些API用于集合类的操作?

Java提供了丰富的API用于集合类的操作。这些API涵盖了各种集合类型&#xff0c;包括List、Set、Queue、Map等&#xff0c;以及它们各自的实现类&#xff0c;如ArrayList、LinkedList、HashSet、LinkedHashSet、PriorityQueue、HashMap、LinkedHashMap等。 以下是一些常用的Jav…

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

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

华纳云:Windows系统服务器分盘的操作方法

在Windows服务器的管理中&#xff0c;合理分配磁盘空间对于数据存储和系统运行至关重要。然而&#xff0c;许多用户可能不清楚如何进行磁盘分区操作。本文将介绍Windows系统服务器分盘的操作方法&#xff0c;帮助用户轻松管理磁盘空间。 步骤如下&#xff1a; 打开磁盘管理工具…

Kolla-ansible部署OpenStack集群

0. OpenStack 部署 系统要求 单机部署最低配置&#xff1a; 2张网卡8G内存40G硬盘空间 主机系统&#xff1a; CentOS Stream 9Debian Bullseye (11)openEuler 22.03 LTSRocky Linux 9- Ubuntu Jammy (22.04) 官方不再支持CentOS 7作为主机系统&#xff0c;我这里使用的是R…

第十届蓝桥杯大赛个人赛省赛(软件类) 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…

Rust - 函数

Rust中通过 fn 关键字来声明某个函数。 针对函数名&#xff0c;Rust使用snake case命名规范&#xff0c;即所有的字母都是小写的&#xff0c;单词之间使用下划线分开。 fn main() {println!("Hello, world!");another_function(); //函数调用 }fn another_function…

域名过期时间怎么计算?

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

河南工业自动化领域的一线公司(依据工信部矿山领域公示名录)

1.原始信息来源&#xff1a; 工信部&#xff1a; 关于矿山领域机器人典型应用场景名单的公示 控制系统较监测系统在性能、安全上更趋严格&#xff0c;复杂性成倍增加。这里从工信部网站上爬到了一份在一个细分领域里投入研发&#xff0c;拥有既有产品的企业和产品名录&#…