博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux下C/C++程序的内存布局
阅读量:4514 次
发布时间:2019-06-08

本文共 1025 字,大约阅读时间需要 3 分钟。

内核空间和用户空间:

  我们在编写程序时使用的内存空间叫虚拟内存,程序在运行时,要完成虚拟内存到物理内存的转换。假如在32位环境上,理论上我们可以使用的虚拟内存空间是4GB,但实际上这4GB并不能完全给我们使用,有一部分内存是固定分配给操作系统内核的,分配给操作系统的这部分内存我们叫它内核空间,除去内核空间以后用户能使用的内存叫用户空间,在linux 32环境下,高地址的1GB是固定给内核使用的,低地址的3GB才是给用户使用的。

用户空间内存分配情况:

各个内存分区的说明:

 

内存分区 说明
程序代码区
(code)
存放函数体的二进制代码。一个C语言程序由多个函数构成,C语言程序的执行就是函数之间的相互调用。
常量区
(constant)
存放一般的常量、字符串常量等。这块内存只有读取权限,没有写入权限,因此它们的值在程序运行期间不能改变。
全局数据区
(global data)
存放全局变量、静态变量等。这块内存有读写权限,因此它们的值在程序运行期间可以任意改变。
堆区
(heap)
一般由程序员分配和释放,若程序员不释放,程序运行结束时由操作系统回收。、、 等函数操作的就是这块内存,这也是本章要讲解的重点。
注意:这里所说的堆区与数据结构中的堆不是一个概念,堆区的分配方式倒是类似于链表。
动态链接库 用于在程序运行期间加载和卸载动态链接库。
栈区
(stack)
存放函数的参数值、局部变量的值等,其操作方式类似于数据结构中的栈。

举例:

#include 
char *str1 = "hello world"; //字符串在常量区,str1在全局数据区int n; //全局数据区char* func(){ char *str = "hello world"; //字符串在常量区,str在栈区 return str;}int main(){ int a; //栈区 char *str2 = "01234"; //字符串在常量区,str2在栈区 char arr[20] = "56789"; //字符串和arr都在栈区 char *pstr = func(); //栈区 int b; //栈区 return 0;}

 

 

  

转载于:https://www.cnblogs.com/418ks/p/10802184.html

你可能感兴趣的文章
【JS点滴】substring和substr以及slice和splice的用法和区别。
查看>>
awk多模式匹配
查看>>
线段树
查看>>
[javascript]实现登陆界面拖动窗口
查看>>
c++ queue类
查看>>
a span等行内元素加margin属性后无效果解决方案
查看>>
查看MySQL数据库大小
查看>>
2019面试题整理
查看>>
Linked List Cycle | & ||
查看>>
2、Jupyter Notebook 快速入门
查看>>
深入理解char * ,char ** ,char a[ ] ,char *a[]
查看>>
Linux网络和进程管理
查看>>
解决jsp无法用el表达式的问题
查看>>
Android 安全 (一)
查看>>
(DP求最长路) hdu 4607
查看>>
math.floor
查看>>
多表查询, 聚集查询和分组查询
查看>>
struct 和typedef struct的区别
查看>>
DOM2和DOM3读书笔记
查看>>
从客户端(Content="<EM ><STRONG ><U >这是测试这...")中检测到有潜在危险的Request.Form 值。...
查看>>