2015.08.24内存分区

简介:
  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,相等;不同的时候返回差值;比较过程是逐个字节比较,返回第一对对应字节位置不同数据的差值


转自:http://blog.csdn.net/qq_31810357

相关文章
|
9天前
|
程序员 编译器 C++
【C++核心】C++内存分区模型分析
这篇文章详细解释了C++程序执行时内存的四个区域:代码区、全局区、栈区和堆区,以及如何在这些区域中分配和释放内存。
25 2
|
2月前
|
存储 程序员 编译器
c++学习笔记08 内存分区、new和delete的用法
C++内存管理的学习笔记08,介绍了内存分区的概念,包括代码区、全局区、堆区和栈区,以及如何在堆区使用`new`和`delete`进行内存分配和释放。
40 0
|
3月前
|
算法 Java 开发者
Java面试题:Java内存探秘与多线程并发实战,Java内存模型及分区:理解Java堆、栈、方法区等内存区域的作用,垃圾收集机制:掌握常见的垃圾收集算法及其优缺点
Java面试题:Java内存探秘与多线程并发实战,Java内存模型及分区:理解Java堆、栈、方法区等内存区域的作用,垃圾收集机制:掌握常见的垃圾收集算法及其优缺点
30 0
|
4月前
|
程序员 编译器 C++
C++内存分区模型(代码区、全局区、栈区、堆区)
C++内存分区模型(代码区、全局区、栈区、堆区)
|
5月前
|
程序员 编译器 C++
内存分区模型(代码区、全局区、栈区、堆区)
内存分区模型(代码区、全局区、栈区、堆区)
|
5月前
|
存储 人工智能 程序员
【重学C++】【内存】关于C++内存分区,你可能忽视的那些细节
【重学C++】【内存】关于C++内存分区,你可能忽视的那些细节
142 1
|
Linux C++
C++可执行目标文件内存分区
我们知道链接器可以将多个目标文件合并成一个可执行目标文件,其中可执行目标文件又可以分为很多个段,本期将简单讲解Linux下C++的内存分段及各段所存放的内容。
C++可执行目标文件内存分区
|
5月前
|
程序员 编译器 C++
C++核心编程一:内存分区模型(持续更新)
C++核心编程一:内存分区模型(持续更新)
|
存储 程序员 编译器
【动态内存错误详解和C的内存分区】
【动态内存错误详解和C的内存分区】
【动态内存错误详解和C的内存分区】
|
存储 程序员 编译器
C语言内存分区(堆,栈,全局/静态存储区,自由存储区,代码区)与可执行程序的三段-(Text段,Date段,Bss段)
C语言内存分区(堆,栈,全局/静态存储区,自由存储区,代码区)与可执行程序的三段-(Text段,Date段,Bss段)
228 0