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");
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

苍穹外卖jwt令牌p10

点击小虫&#xff08;进入断点调试&#xff09;&#xff0c;打上断点&#xff0c;然后前端点击登录&#xff08;此时前端的数据会作为参数传入&#xff09;&#xff1a; 光标放在字段上还会显示接收到的数据&#xff1a; 若想程序在所希望的地方停止&#xff0c;可以添加断点&a…

NetSuite中Inactive Item后相关Transaction是否能继续?

今天的标题以一个问句出发&#xff5e;灵感来源于我们在一个项目上要准备数据切换的事宜&#xff0c;我们需要明确&#xff0c;将一个物料Inactive之后&#xff0c;涉及到该Item的Transaction是否还能在业务或者财务处理的环节继续操作&#xff5e;基本的测试分三种场景&#x…

【Linux】基础IO----系统文件IO 文件描述符fd 重定向

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解在Linux下的系统文件IO&#xff0c;知道什么是文件描述符&#xff0c;什么是重定向 > 毒鸡汤&#xff1a;白日莫闲过&#xff0c;青春不再来。 …

实验2-1 进程相关的系统调用

一、实验目的 学习Linux中与进程控制相关的系统调用&#xff0c;加深对进程、进程树等概念的理解。 二、实验内容 1. 学习使用以下几类系统调用&#xff0c;进行编程练习 获取进程的信息&#xff0c;getpid(), getppid() 父子进程控制&#xff0c;fork()&#xff0c;wai…

前端三剑客 —— JavaScript (第九节)

目录 内容回顾&#xff1a; 1.事件解除 2. Ajax jQuery选择器 回顾CSS选择器 CSS选择 1.基本选择器 2.包含选择器 3.伪类选择器 4.伪元素选择器 5.属性选择器 jQuery 库 jQuery 动画 系统动画 自定义动画 常见API操作 内容回顾&#xff1a; 1.事件解除 如果是使…

一文读懂RISC-V与ARM

RISC-V和ARM是近年来备受关注的两种处理器架构。RISC-V是一种基于精简指令集计算(RISC)原理的开源指令集架构(ISA)&#xff0c;而ARM是一种专有ISA&#xff0c;由于其长期存在于嵌入式系统和移动设备中&#xff0c;已成为嵌入式系统和移动设备的主导选择。市场以及多年积累的信…

安装图数据库Nebula Graph

前言 今年开始&#xff0c;很多机关单位、央国企都要求所有新建的信息系统必须走国产化技术路线&#xff0c;而且还要求满足“信创”要求。“信创”通俗来讲就是要自研&#xff0c;那种拿个开源套壳的都不满足信创要求。之前研究了一段时间的neo4j&#xff0c;显然neo4j不满足…

雪亮工程视频联网综合管理/视频智能分析系统建设方案(一)

一、行业背景 雪亮工程主要是针对农村地区治安防控的监控项目&#xff0c;在乡村的主干道、路口、人群聚集地部署高清摄像头&#xff0c;通过三级综治中心和指挥平台&#xff0c;将视频图像信息系统纵向下延至县、乡、村&#xff0c;同时利用系统拓展在安防、社会治理、智慧交…

MWeb Pro For Mac v4.5.9 强大的 Markdown 软件中文版

MWeb 是专业的 Markdown 写作、记笔记、静态博客生成软件&#xff0c;目前已支持 Mac&#xff0c;iPad 和 iPhone。MWeb 有以下特色&#xff1a; 软件下载&#xff1a;MWeb Pro For Mac v4.5.9 软件本身&#xff1a; 使用原生的 macOS 技术打造&#xff0c;追求与系统的完美结合…

Linux从入门到精通 --- 3.用户、权限

文章目录 第三章&#xff1a;3.1 root用户3.1.1 su3.1.2 exit3.1.3 sudo 3.2 用户和用户组3.2.1 用户组管理创建用户组删除用户组 3.2.2 用户管理创建用户删除用户查看用户所属组修改用户所属组 3.2.3 getent一&#xff1a;二&#xff1a; 3.3 查看权限控制信息3.3.1 认知权限信…

IDEA 控制台中文乱码 4 种解决方案

前言 IntelliJ IDEA 如果不进行相关设置&#xff0c;可能会导致控制台中文乱码、配置文件中文乱码等问题&#xff0c;非常影响编码过程中进行问题追踪。本文总结了 IDEA 中常见的中文乱码解决方法&#xff0c;希望能够帮助到大家。 IDEA 中文乱码 解决方案 一、设置字体为支…

软件安全评估之设计评审入门(上)

壹 基础概念 在软件开发生命周期&#xff08;Software Development Life Cycle&#xff0c;简称SDLC&#xff09;中&#xff0c;设计评审&#xff08;Design Review&#xff09;是一个关键的阶段&#xff0c;旨在确保软件设计满足项目需求和目标&#xff0c;并且能够高效、可靠…

GDAL源码剖析(九)之GDAL体系架构

GDAL源码剖析&#xff08;九&#xff09;之GDAL体系架构_gdal 源码-CSDN博客 在GDAL库中包含栅格数据的读写&#xff0c;矢量数据的读写&#xff0c;以及栅格和矢量数据的相关算法。下面主要对GDAL中栅格数据和矢量数据的体系架构做一个简单的说明。本人英文很烂&#xff0c;有…

集装箱5G智能制造工厂数字孪生可视化平台,推进企业数字化转型

集装箱5G智能制造工厂数字孪生可视化平台&#xff0c;推进企业数字化转型。在当下数字化转型的热潮中&#xff0c;集装箱5G智能制造工厂数字孪生可视化平台成为了推动企业转型升级的重要工具。这一平台将先进的5G技术与智能制造相结合&#xff0c;通过数字孪生技术实现生产过程…

数字化赋能农业创新发展新篇章:数字乡村建设推动农业现代化、提升农业综合效益与竞争力

目录 一、数字乡村建设的内涵与意义 二、数字化赋能农业创新发展的路径 1、推动智慧农业发展 2、加强农村电子商务建设 3、提升农业信息化水平 三、数字乡村建设推动农业现代化与提升综合效益与竞争力 1、推动农业现代化进程 2、提升农业综合效益 3、增强农业竞争力 …

HTML5+CSS3+JS小实例:图片切换特效之模糊变清晰

实例:图片切换特效之模糊变清晰 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, i…

Windows搭建Jellyfin影音服务结合内网穿透实现公网访问本地视频文件

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…

大势智慧在出模型时输入七参数可以导出地方坐标系吗?

大势智慧自主研发的网格大师或者DasViewer有坐标转换功能&#xff0c;可以使用七参数计算功能转换到地方坐标&#xff0c;直接输以前的七参是不行的&#xff0c;需要准备源坐标和目标坐标。 DasViewer是由大势智慧自主研发的免费的实景三维模型浏览器,采用多细节层次模型逐步自…

【Unity】组件组合使用心得(单行可自动拓展Scroll View)

在这之前&#xff0c;一直是在使用Scroll View进行滑动内容设置&#xff0c;但设置的都是不明不白的&#xff0c;而且有的时候设置好了之后也不知道是为什么&#xff0c;总感觉哪里不对劲&#xff0c;而且好也不知道为什么好&#xff0c;可能是长时间在做管理上的内容&#xff…

淘宝详情API接口文档(java)get调用

淘宝详情API接口是用于获取淘宝商品详细信息的接口&#xff0c;它允许开发者通过发送请求&#xff0c;获取商品的描述、价格、评价等信息。下面是一个关于淘宝详情API接口的示例文档&#xff0c;包括接口地址、请求参数、响应参数等内容。 淘宝详情API接口文档 一、接口地址 …