图为一个执行进程的内存地址空间。
代码段就是存储程序文本的,所以有时候也叫做文本段,指令指针中的指令就是从这里取得。数据段是存储数据用的,还可以分成初始化为非零的数据区,BSS,和堆(Heap)三个区域。初始化非零数据区域一般存放静态非零数据和全局的非零数据。BSS是Block Started by Symbol的缩写,原本是汇编语言中的术语。该区域主要存放未初始化的全局数据和静态数据。还有就是堆了,这个区域是给动态分配内存是使用的,也就是用malloc等函数分配的内存就是在这个区域里的。它的地址是向上增长的。最后一个堆栈段(注意,堆栈是Stack,堆是Heap,不是同一个东西),堆栈可太重要了,这里存放着局部变量和函数参数等数据。

需要注意的是,代码段和数据段之间有明确的分隔,但是数据段和堆栈段之间没有,而且栈是向下增长,堆是向上增长的,因此理论上来说堆和栈会“增长到一起”,但是操作系统会防止这样的错误发生,所以不用过分担心。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>void *getP(){printf("---1\n");char *p = "rodfqeqwerng\n";return p;}
void GetMemory(char **p, int num)
{ *p = (char *)malloc(num);
}
void GetMemory2(char **p, int num)
{*p = (char *)malloc(sizeof(char) * num);
}
char *GetMemory3(int num)
{char *p = (char *)malloc(sizeof(char) * num);return p;
}
void main(int *argv, char *args[]){char *p = NULL;p = getP();printf(p);/*解析:(1)能够输出hello (2)内存泄漏*/
/*char *str= NULL; GetMemory(&str, 100); strcpy(str, "hello"); printf(str);
*//*解析:篡改动态内存区的内容,后果难以预料,非常危险。因为free(str);之后,str成为野指针,if(str!= NULL)语句不起作用。*/
/*char *str= (char *) malloc(100); strcpy(str, "hello\n"); free(str); if(str!= NULL) { printf(str);strcpy(str, "world\n"); printf(str); }
*//*解析:如果非得要用指针参数去申请内存,那么应该改用“指向指针的指针”.由于“指向指针的指针”这个概念不容易理解,我们可以用函数返回值来传递动态内存。*/char *str= NULL;GetMemory2(&str, 100); // 注意参数是&str,而不是strstrcpy(str, "hello\n");printf(str);free(str);/*解析:用函数返回值来传递动态内存这种方法虽然好用,但是常常有人把return 语句用错了。这里强调不要用return语句返回指向“栈内存”的指针*/
/*char *str= NULL;str= GetMemory3(100);strcpy(str, "hello\n");printf(str);free(str);
*/
}

C语言进程的内存地址空间分配相关推荐

  1. 8086PC机的内存地址空间分配

    8086PC机的内存地址空间分配 转载于:https://www.cnblogs.com/LoveFishC/archive/2012/07/25/3845572.html

  2. C语言 强行给内存地址赋值

    最近看STM32代码,有这样一段话不理解 #define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) 然后我就思考了下,不就是定义一个宏,然后声明一个结构体变量,进行赋值么 ...

  3. C语言进程的内存分区、变量作用域和生存期

    1.内存分区  C源代码进过预处理.编译.汇编和链接4步生成一个可执行程序.         程序在没有运行之前,也就是说程序没有被加载到内存前,可执行程序内部已经分好3段信息,分别是代码区(text ...

  4. 易语言如何读内存地址的数值,模仿CE

    子程序名 返回值类型 公开 备 注 _按钮1_被单击 变量名 类 型 静态 数组 备 注 游戏进程id 整数型 游戏窗口句柄 整数型 内存x 类_内存 游戏窗口句柄 = 窗口_取句柄 (, , &qu ...

  5. Linux进程管理+内存管理:进程切换的TLB处理(ASID-address space ID、PCID-process context ID)

    目录 一.前言 二.单核场景的工作原理 1.block diagram 2.绝对没有问题,但是性能不佳的方案 3.如何提高TLB的性能? 4.特殊情况的考量 4.进一步提升TLB的性能 - ASID( ...

  6. 通过WriteProcessMemory改写进程的内存

    http://www.cnblogs.com/feiyucq/archive/2009/10/21/1587628.html 以PROCESS_ALL_ACCESS权限打开进程以后既能够使用ReadP ...

  7. 搜索进程内存地址_Linux编程 6 (查看进程 ps 及输出风格)

    一.查看进程命令ps 1.1 默认ps 命令 在默认情况下,ps命令只会显示运行在当前控制台下,属于当前用户的进程,在上图中,我们只运行了bash shell以及ps命令本身. 上图中显示了程序的进程 ...

  8. linux c语言变量地址类型,C语言基础知识:访问内存地址的方法

    汇编语言寄存器间接寻址方法 #define GPJ0CON0xE0200240 ldr r0, =GPJ0CON //把地址值赋给寄存器r0,从后面的=可以看出用的是ldr伪指令,因为需要编译器来判断 ...

  9. 汇编怎么从内存地址写入连续的数字_汇编语言 第一章 基础知识

    系列文章见:Neptune 第一章 基础知识 1.1 机器语言 机器语言是机器指令的集合,机器指令展开来讲就是一台机器可以正确执行的命令. 由图可见,机器语言是十分晦涩难懂和不易查错的. 1.2 汇编 ...

最新文章

  1. nginx 配置https 并解决重定向后https协议变成了http的问题
  2. [转]字符编码,ansi, unicode,utf-8, utf-16
  3. 最受IT公司欢迎的50款开源软件
  4. 大牛用SSM框架实现了支付宝的支付功能,满满干货指导
  5. sap甲方_带你走进SAP项目实施过程——前言
  6. 力扣112. 路径总和(JavaScript)
  7. 中兴F412光猫超级密码破解、破解用户限制、关闭远程控制、恢复路由器拨号
  8. 数据结构与算法顺序表数组版
  9. nginx 命令_MAC 操作nginx命令
  10. java中String stringBuffer StringBuider
  11. C# PDF操作之-PDF转WORD
  12. Activity设置竖屏显示
  13. 微软Kinect for windows SDK 使用教程 (NUI部分)
  14. perl中unicode属性
  15. js正则表达式 part1 - Kaiqisan
  16. 读心或成现实,OpenBCI要将脑波传感技术用于VR中
  17. 【解决方案】阿里企业云邮箱 报错 526 Authentication failure[0]
  18. 1.设计一个敏感词过滤程序
  19. 2017第十九届中国国际光电博览会会刊(参展商名录)
  20. 访问Google首页显示该页无法显示

热门文章

  1. Python3多进程与多线程区别及使用(1.进程)
  2. SpringBoot文件上传大小设置(yml中配置)
  3. PHP_递归实现无限级分类
  4. python操作各种excel库
  5. ES2005 js =
  6. css实现居中的各种方法
  7. 没有在该机执行windows脚本宿主的权限_解决办法
  8. java 中反射的使用_java中反射的基本使用
  9. java shutdowninput,java中socket.shutdownOutput()使用后如果还想用输出流怎么办
  10. python怎样填充颜色_python – 使用颜色填充Tkinter画布对象之间的空间