吉 安

简单粗暴

  • 主页
  • 认识
  • 编程
  • 问题
  • 工具
  • 想法
所有文章 友链 关于我

吉 安

简单粗暴

  • 主页
  • 认识
  • 编程
  • 问题
  • 工具
  • 想法

内存的使用

2020-06-04

面试的时候经常会被问到变量存在内存的哪里,你知道吗?

我们通过一个例子搞懂他:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>

/*
* 每个进程都有独立的虚拟地址空间,进程访问的虚拟地址并不是真正的物理地址。
* 虚拟地址可通过每个进程上的页表(在每个进程的内核虚拟地址空间)与物理地址进行映射,获得真正物理地址。
* 如果虚拟地址对应物理地址不在物理内存中,则产生缺页中断,真正分配物理地址,同时更新进程的页表;如果此时物理内存已耗尽,则根据内存替换算法淘汰部分页面至物理磁盘中。
*
* 虚拟地址空间由低地址到高地址分别为:
* 1、只读段:该部分空间只能读,不可写(包括:代码段、rodata 段(C常量字符串和#define定义的常量))。
* 2、数据段:保存全局变量、静态变量的空间。
* 3、堆 :就是平时所说的动态内存, malloc/new 大部分都来源于此。其中堆顶的位置可通过函数 brk 和 sbrk 进行动态调整。
* 4、文件映射区域 :如动态库、共享内存等映射物理空间的内存,一般是 mmap 函数所分配的虚拟地址空间。
* 5、栈:用于维护函数调用的上下文空间,一般为 8M ,可通过 ulimit –s 查看。
* 6、内核虚拟空间:用户代码不可见的内存区域,由内核管理(页表就存放在内核虚拟空间)。
*/

static int a=0;//静态变量存放数据段
int b=1;//全局变量存放数据段

int main(){
int c=2;//局部变量存放在栈
char s1[]="012";//局部变量存放在栈
char *s2="012";//字符常量存放只读段
char *s3=(char*)malloc(4);//malloc存放堆
/*
* 默认情况下,malloc函数分配内存,
* 如果请求内存大于128K(可由M_MMAP_THRESHOLD选项调节),
* 那就不是去推_edata指针了,而是利用mmap系统调用,从堆和栈的中间分配一块虚拟内存。
* _edata指针(glibc里面定义)指向数据段的最高地址。
*/
char *s4=(char*)malloc(140000);
strcpy(s3,"012");
strcpy(s4,"012");
printf("a=%d,b=%d,c=%d,s1=%s,s2=%s,s3=%s,s4=%s\n",a,b,c,s1,s2,s3,s4);
// printf("a=%d,b=%d,c=%d,s1=%s,s2=%s,s3=%s\n",a,b,c,s1,s2,s3);
while(1){
sleep(1000);
}
return 0;
}
赏

谢谢你请我吃糖果

支付宝
微信
  • 编码
  • c-cpp
  • 内存

扫一扫,分享到微信

微信分享二维码
初识QtWebEngine
认识各种内存地址
© 2022 吉 安
访客量:25799
  • 所有文章
  • 友链
  • 关于我

tag:

  • 问题
  • qt
  • 工具
  • 编码
  • 音视频
  • 一些认识
  • 进程
  • 想法
  • c-cpp
  • 内存

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • pcm与opus互转

    2022-02-23

    #编码#音视频

  • 初识音视频

    2021-10-09

    #音视频#一些认识

  • 认识GRUB

    2021-01-14

    #工具#一些认识

  • 关于IT女性

    2020-10-30

    #想法

  • 认识selinux

    2020-10-15

    #工具#一些认识

  • 认识firewalld

    2020-10-12

    #工具#一些认识

  • 认识audit

    2020-10-10

    #工具#一些认识

  • 简单讲讲deb打包

    2020-08-18

    #工具

  • debian系linux安装软件

    2020-08-17

    #工具

  • QWebEngineView最小化后缩略图显示空白

    2020-07-20

    #问题#qt

  • Hexo无法解析Markdown表格

    2020-07-02

    #问题

  • 认识chromuim

    2020-07-02

    #一些认识

  • 初识QtWebEngine

    2020-06-28

    #qt#编码#c-cpp

  • 内存的使用

    2020-06-04

    #编码#c-cpp#内存

  • 认识各种内存地址

    2020-06-02

    #一些认识#内存

  • 进程的限制之ulimit

    2020-05-07

    #工具#进程

  • 认识/proc/[pid]/

    2020-05-06

    #一些认识#进程

  • 进程的查看工具

    2020-05-06

    #工具#进程

  • 认识进程

    2020-04-29

    #一些认识#进程

  • 认识多处理器架构

    2020-04-17

    #一些认识

  • 认识x11

    2020-04-16

    #一些认识

  • 进程调试工具strace

    2020-04-15

    #工具#进程

  • 小黄同学
猛男!