内核空间和用户空间:

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

用户空间内存分配情况:

各个内存分区的说明:

内存分区 说明
程序代码区
(code)
存放函数体的二进制代码。一个C语言程序由多个函数构成,C语言程序的执行就是函数之间的相互调用。
常量区
(constant)
存放一般的常量、字符串常量等。这块内存只有读取权限,没有写入权限,因此它们的值在程序运行期间不能改变。
全局数据区
(global data)
存放全局变量、静态变量等。这块内存有读写权限,因此它们的值在程序运行期间可以任意改变。
堆区
(heap)
一般由程序员分配和释放,若程序员不释放,程序运行结束时由操作系统回收。malloc()calloc()free() 等函数操作的就是这块内存,这也是本章要讲解的重点。

注意:这里所说的堆区与数据结构中的堆不是一个概念,堆区的分配方式倒是类似于链表。

动态链接库 用于在程序运行期间加载和卸载动态链接库。
栈区
(stack)
存放函数的参数值、局部变量的值等,其操作方式类似于数据结构中的栈。

举例:

#include <stdio.h>

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

  

最新文章

  1. 用SQL语句将数据表中的数据保存为JSON格式
  2. [React] 多组件生命周期转换关系
  3. ZeroMQ接口函数之 :zmq_ctx_shutdown - 停止一个ZMQ context
  4. sharepoint 2013 开发环境安装
  5. 扩展 HtmlwebpackPlugin 插入自定义的脚本
  6. python_way day14 HTML
  7. How to: Hide the Ribbon in SharePoint 2010
  8. 数据结构(堆):SCOI 2009 生日礼物
  9. YII CDbCriteria总结
  10. 实战parse_ini_file()及扩展函数解析ini文件完整版
  11. [ An Ac a Day ^_^ ] [kuangbin带你飞]专题十二 HDU 1176 免费馅饼
  12. Android面试题随笔1
  13. C++三目运算符的增强
  14. Visual Studio Code 使用 Git插件报错 - Permission denied (publickey)
  15. linux查看进程已经运行了多长时间
  16. Java 元编程及其应用
  17. instanceof详解
  18. JAVA基础1---Object类解析
  19. linux下安装lnmp环境
  20. python第三十课--异常(异常对象传递过程)

热门文章

  1. 18. 视图Ext.Viewport和窗口Ext.Window用法
  2. E20180119
  3. 图片预览------photoswipe 使用
  4. Hdu 4612 Warm up (双连通分支+树的直径)
  5. BFS(最短路) HDU 2612 Find a way
  6. C/C++自实现的函数(memset, memcpy, atoi)
  7. Eclipse里的Java EE视图在哪里?MyEclipse里的Java EE视图在哪里?MyEclipse里的MyEclipse Java Enterprise视图在哪里?(图文详解)
  8. [转]Windows Azure平台简介(一):定位与产品结构
  9. 生成清除某个数据库下的所有表的SQL语句
  10. win7如何设置自动关机