内存划分

1、//内存区域的划分(从低到高)

//1.栈区

//2.堆区++++++++++++++重点+++++++++++

//3.静态区(全局区)
    //4.常量区

//5.代码区

2、static int number = 10;//被static 修饰的全局变量生命周期随着程序的创建而创建,随着程序的消失而消失;

3、//局部变量:定义在函数内部的变量就叫做局部变量,局部变量都是存储在栈区

3、//内存管理的时候系统也是遵循内存对齐原则,因为这样可以提高内存的分配效率

4、//静态区(全局区)

//有static 修饰的变量存放在静态区,静态区的变量有一个特点,整个程序运行中,只被初始化一次;如果人为未初始化,系统默认初始化为0

5、//系统提供的函数由于使用比较频繁,我们把它存放在栈区,原因是栈区的内容会被反复的创建销毁,不需要我们去管理内存还是因为栈区的内存开辟和释放的内存

6、//代码区:程序中运行的函数或者变量等等语句都会编译成CPU指令,存放在代码区;

7、 malloc calloc  realloc memset  (要做释放free(p);操作并赋值p =Null)

memcpy  memcmp (不用做释放操作)

//  free(p);//释放掉p 指向的堆区空间,只是标记删除,不清空里面的内容

//   free(p); 过度释放,释放多次,过度释放会造成crash 崩溃

p = NULL;  //指向的是无效的空间,防止野指针错误

(1)malloc:申请内存的函数

//   void   *malloc( size_t)

//   void * ,泛类型,void * 返回的指针可以赋值给任何类型的指针,int * ,float* ,char *,short*

//  size_t 代表申请多少个字节的大小的内存空间

//   malloc  的作用,申请的 size 个字节大小的空间,并把申请的空间首地址返回

(2) //calloc(size_t, size_t)

//两个参数的意思;表示申请n个size大小的空间,返回时申请空间的首地址,但是它在申请空间的时候会多一步处理,清除么一个字节里的内容,也就是清零操作,正是因为calloc 多了一 步 清零操作,执行效率要比malloc低;

//realloc(p, n)  //内存的重新分配,第一个参数是地址,第二个参数是重新分配的内存大小

(4)//使用relloc 重新分配空间的时候,若再原有分配空间的基础上可以连续载增加   n (原有空间大小 )个空间大小,指针指向不会改变;若这时不可以连续增加(n - 原有空间大小),会将之前的空间给释放掉,然后再去堆区的其他位置开辟连续的n个空间大小的内存,指针的指向发生改变了;

注意:重新分配的空间需要接收

//    int *p6 = malloc(12);
//    *p6 = 10;
//    *(p6 + 1) = 20;
//    *(p6 + 2) = 30;
//        printf("之前的地址:%p\n",p6);
//     p6 = realloc(p6, 20);//重新分配空间的大小
//  printf("之前的地址:%p\n",p6);
//    *(p6 + 3) = 40;

//    *( p6 + 4) = 50;

//    //重新分配的空间会把之前空间的内容给拷贝过来,放到相对的位置,所以需要遍历

//    for (int i = 0; i < 5; i ++) {
//        printf("%d ",*(p6 + i));
//    }
//    free(p6);

//    p6 = NULL;

(3)memset(开始地址, n, size);     给定一个开始地址,将size字节的空间大小内的数据置为n,若n为0,size为10,就是把10个字节中的数据置为0;

(4) memcpy(dest, source, n);     //从源source指针开始的位置,向目的指针拷贝n个字节的数据;注意:前面的空间要足够大;

(5)memcmp(p1, p2, n);       比较p1 和 p2 指向的内存里的内容是否相同,比较n 个字节,返回值是0,相等;不同的时候返回差值;比较过程是逐个字节比较,返回第一对对应字节位置不同数据的差值

时间: 2024-08-06 16:06:38

内存划分的相关文章

jvm运行时内存划分

(根据<深入理解java虚拟机>这本书总结) 本文主要解释jvm内存模型,以及各个部分的作用.都是自己总结的给自己看的通俗语言,未用专业术语的见谅. 一.为什么要了解jvm内存模型? 在了解一个类的编译-加载-内存分配-初始化所有过程前,要先了解jvm的内存模型.这样对整个java体系可能会更加便于理解.当然,如果不理解这些,也是没关系的,照样可以进行java开发. 二.jvm内存模型 1.根据自己的理解举个最简单的例子,一个main方法启动,进程运行,在这个过程中,会调用方法.开启多个线程.

JVM内存划分总结

概述 在说jvm内存划分之前,先来说下java程序具体的执行流程: Java源文件经过java编译器编译后变成class字节码文件, Jvm的classloader加载class文件完成后,交由execution engine执行. 执行引擎执行过程中用到的所有数据和信息,都存储在runtime data area中. Runtime data  area 就是我们常说的JVM内存. Runtime data area Runtime data area 都包括什么呢? <Java虚拟机规范>

[c++]程序的内存划分理解

全局和静态数据区:用于存放全局变量和静态变量(全局变量和局部变量) 常量数据区:用于存放常量数据 代码区:用于存储代码 栈:用于局部变量和函数参数 堆:程序员申请(程序员控制的部分,new/delete #include <stdio.h> #include <stdlib.h> int gGlobal=100; // global int main(void){ char *pLocalString1="LocalString1"; const char *p

Java运行时环境---内存划分

背景:听说Java运行时环境的内存划分是挺进BAT的必经之路. 内存划分: Java程序内存的划分是交由JVM执行的,而不像C语言那样需要程序员自己买单(C语言需要程序员为每一个new操作去配对delete/free代码),放权给JVM虚拟机处理有利也有弊,好处是不容易出现内存泄漏和内存溢出问题,坏处就是自己的屁股不能自己擦,万一有一天JVM罢工不释放了,还是自个忘了释放,So了解虚拟机容易引起内存泄漏和溢出的场景对Java程序员来说还是必不可少的.[内存泄漏:Out Of Memmory,系统

JDK8中JVM堆内存划分

一:JVM中内存 JVM中内存通常划分为两个部分,分别为堆内存与栈内存,栈内存主要用运行线程方法 存放本地暂时变量与线程中方法运行时候须要的引用对象地址. JVM全部的对象信息都 存放在堆内存中.相比栈内存,堆内存能够所大的多,所以JVM一直通过对堆内存划分 不同的功能区块实现对堆内存中对象管理. 堆内存不够最常见的错误就是OOM(OutOfMemoryError) 栈内存溢出最常见的错误就是StackOverflowError.程序有递归调用时候最easy发生 二:堆内存划分 在JDK7以及其

java虚拟机内存划分

java虚拟机内存区域 参照官方文档 1.8版本 Oracle虚拟机内存划分文档 : https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5 The Java Virtual Machine defines various run-time data areas that are used during execution of a program. Some of these data areas are

Java虚拟机的内存划分

内存概述 内存是计算机中的重要原件,临时存储区域,作用是运行程序.我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存.Java虚拟机要运行程序,必须要对内存进行空间的分配和管理.. Java虚拟机的内存划分 为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式 JVM的内存划分: 栈: 存储局部变量 堆:存储new出来的数组或对象 一个数组内存图 原文地址:https://www.cnblogs.

【学习ios之路:C语言】存储区内存划分

一. 内存存储区的划分: 1.栈区:栈区主要存放函数内部定义的变量,数组.函数调用时,开辟空间,函数执行完毕,回收空间,空间的开辟与回收有系统管理. 2.堆区:堆区最大的特点:空间的开辟与释放有开发人员手动管理. 3.全局区静态区:主要存放函数外部定义的全局变量以及静态变量,空间一旦开辟,就不会回收.直到应用程序执行结束. 4.常量区:存储常量.1.整形常量.2.浮点型常量.3,字符串常量.4.字符串常量. 5.代码区:存放程序编译之后生成的cpu指令. 二.malloc,在堆区开辟空间. //

Java中的内存划分

Java程序在运行时,需要在内存中分配空间.为了提高运行效率,就对数据进行了不同的空间划分.因为每一片区域都有特定的数据处理方式和内存管理方式. 具体分为5种内存空间: 程序计数器:保证线程切换后能恢复到原来的执行位置. 虚拟机栈:(栈内存)为虚拟机执行java方法服务,方法被调用时,创建栈帧- 本地方法栈:为虚拟机执行使用到的Native方法服务 堆内存:存放所有new出来的东西 方法区:存储被虚拟机加载的类信息,常量,静态常量,静态方法等. 运行时常量池(方法区的一部分) GC对他们的回收: