C语言内存空间的使用--内存分布图

内存分布图

  内核空间    应用程序不许访问
------------------------------- 3G
  栈空间      局部变量           RW
-----------
  运行时的堆空间 malloc
-----------
  全局的数据空间 全局变量(又可以分为:初始化的,未初始化)static RW位置: 初始化data 未初始化和static bss 
  只读数据段    "hello" 字符串常量    R        const         位置:  TEXT
  代码段        code                R                      位置:  TEXT
------------ 
0x0 :

1,只读空间

{

全局的数据控件,只读数据的,代码段

}

静态空间。程序启动前,就存在在内存中。整个程序结束了才释放内存,生存周期最长

2,栈空间

局部变量。出栈,入栈

运行时才有。运行时,函数内部使用的变量,函数一旦返回,就指针就不再指向栈空间(指针释放),生存周期是函数内

3,堆空间

运行时才有。运行时,可以自由,仔我管理的分配和释放的空间,生命周期由程序员决定

1>需要内存分配

malloc(),一旦成功,返回分配好的地址给我们,只需要接受,对于这个新地址的读法,由程序员灵活把握,输入参数指定分配的大小,单位就是B。

分配的大小

 int a[5];     malloc(5*sizeof(int))
char *p;
 p = (char *)malloc(100);
if(p == NULL){
  error
}

典型内存泄漏。p赋值没释放
void fun()
{
  char *p;
   p = (char *)malloc(100);
  return ;
}

2>需要释放内存

  free(p);
时间: 2024-11-05 13:34:11

C语言内存空间的使用--内存分布图的相关文章

PCIe to AXI Translation——PCIe 内存空间到AXI内存空间的转换

UltraScale系列芯片包含PCIe的Gen3 Integrated Block IP核在内的多种不同功能的IP核都会有一页设置为PCIe:BARs,设置IP核的Base address register 的相关参数,如图1所示: 图1 PCIe:BARs 配置图 一般来说在FPGA中使用PCIe核都是Endpoint mode,我们的PC主机端是Rootpoint mode,一般会有一个Root Complex的混合管理器,来管理接入PCIe总线的端点设备.对于PC机来说,当PC机识别该P

java内存空间详解

Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介绍一下Java在内存分配方面的知识.一般Java在内存分配时会涉及到以下区域: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 ◆堆:存放用new产生的数据 ◆静态域:存放在对象中用static定义的静态成员 ◆常量池:存放常量 ◆非RAM存储:硬盘等永久存储空间 Java内存

Gexmul虚拟机内存空间原理简述

Gxemul将内存空间分为两部分管理,一部分是物理内存,地址分配到0x00000000,另一部分是device的地址,注册device的时候由device自己指定空间 1 创建物理内存 memory.cc memory_new {     初始化物理内存参数     mem->physical_max = physical_max;     mem->dev_dyntrans_alignment = 4095;     创建物理内存     mem->pagetable = (unsig

java内存空间

Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介绍一下Java在内存分配方面的知识.一般Java在内存分配时会涉及到以下区域: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 ◆堆:存放用new产生的数据 ◆静态域:存放在对象中用static定义的静态成员 ◆常量池:存放常量 ◆非RAM存储:硬盘等永久存储空间 Java内存

Android 性能优化之内存泄漏检测以及内存优化(上)

在 Java 中,内存的分配是由程序完成的,而内存的释放则是由 Garbage Collecation(GC) 完成的,Java/Android 程序员不用像 C/C++ 程序员一样手动调用相关函数来管理内存的分配和释放,虽然方便了很多,但是这也就造成了内存泄漏的可能性,所以记录一下针对 Android 应用的内存泄漏的检测,处理和优化的相关内容,上篇主要会分析 Java/Android 的内存分配以及 GC 的详细分析,中篇会阐述 Android 内存泄漏的检测和内存泄漏的常见产生情景,下篇会

内存泄露 Memory Leaks 内存优化【总结】

什么是内存泄露 内存管理一直是Java 所鼓吹的强大优点.开发者只需要简单地创建对象,而Java的垃圾收集器将会自动管理内存空间的分配和释放. 但在很多情况下,事情并不那么简单,在 Java程序中总是会频繁地发生内存泄露(Memory Leaks). 内存泄漏就是:当某些对象不再被应用程序所使用,但是由于仍然被引用而导致垃圾收集器不能释放他们. 或者说是:我们对某一内存空间使用完成后没有释放. 用白话来说就是:该回收的内存没被回收. 要理解这个定义,我们需要理解内存中的对象状态.下图展示了什么是

C-数组, 字符串的输入输出, 内存分配, 三种内存分配函数

数组初始化 1.数组初始化的时候, 可以这样 1 int len = 3; 2 int arr[len]; 2.但是这样不可以: 1 int len = 3; 2 int arr[len] = {1, 2, 3}; 3.但是可以这样: 1 int arr[3] = {1, 2, 3}; 2不可以的原因: 编译器编译的时候 int arr[3] = {1, 2, 3}这种方式会转换成: 1 int arr[3]; 2 arr[0] = 1; 3 arr[1] = 2; 4 arr[2] = 3;

JAVA内存管理之堆内存和栈内存

我们常常做的是将Java内存区域简单的划分为两种:堆内存和栈内存.这种划分比较粗粒度,这种划分是着眼于我们最关注的.与对象内存分配密切相关的两类内存域.其中栈内存指的是虚拟机栈,堆内存指的是java堆. 1.栈内存,即虚拟机栈.每个方法被执行的时候都会同时创建一个栈帧,用来存储局部变量,操作栈,动态链接,方法出口等信息.局部变量包括各种基本类型的变量和对象的引用变量都是在方法的栈内存中分配.其中,64位长度的long和double类型的数据占用2个局部变量的空间,其他数据类型只占用1个.局部变量

C语言之内存空间

C语言可以用malloc关键字动态申请内存空间.数组在定义时就必须确定好空间的大小(固定值),动态申请可以由用户自定义空间的大小.c中只要申请了空间就必须free()释放掉,否则会造成内存泄露. #include<stdio.h> #include<windows.h> int main() { int* p = NULL; int a = 0; scanf_s("%d",&a);//使用malloc动态申请内存,用户可以自己定义申请多少个int,不造成