内存四区中堆区见解

 

  堆区

  由程序员分配释放 若程序员不释放,则在程序结束后自动释放。

  堆区就像定义一样,由程序员自己分配,这里我们使用malloc函数来分配空间;

  #include <stdio.h>

  #include <string.h>

  #include <stdlib.h>

  char *getMem(int num)

  {

    char *p = NULL;

    p = (char *)malloc(sizeof(char) * num);//在堆区分配一块内存,并将指针指向这块区域

    

    if(p == NULL)//判断是否成功分配内存

    {

     return NULL;

    }

    return p;//这里返回的是地址,即在堆区上分配内存的首地址

  }

  int main()

  { 

    char *tmp = NULL;

    tmp = getMem(10);//将10传给形参num

    //在堆区分配的内存空间在子函数运行完毕之后,是不会被析构掉

    if(tmp == NULL)//判断是否成功分配内存空间,

    {

      printf("func the getMem() err\n");

      return -1;

    }

    strcpy(tmp,"1122");//向tmp所指向的内存空间拷贝数据,而不是将数据copy到tmp变量里

    printf("%s\n",tmp);//打印字符串

    if(tmp != NULL)//如果tmp指向的不是空地址,则进入if语句

    {

      free(tmp);//将堆区分配的内存空间释放掉,但是tmp任然存放所分配空间的地址

      printf("%s\n",tmp);//打印的是一堆乱码

    }

    tmp = NULL;//再次将其指向NULL

  

    system("pause");

    return 0;

  }

  这样我们就可以发现,堆区和栈区的不同,在堆区上分配的内存空间是不会自动释放的,除非当整个程序都运行完毕。所以如果在做一个大型项目的时候,为了节约资源,当我们不再用它或者很少再使用它的时候,我们可以将其释放掉,等到用的时候重新分配

  

时间: 2024-10-01 07:55:35

内存四区中堆区见解的相关文章

内存四区中全局区见解

今天我把自己对于内存四区中全局区见解写出来,希望可以帮到大家,同时也希望指出我的不正! 可能有些人不解,我不是想通过,内存四区引入指针么?怎么上来就用指针? 这一点我要说明一下,我用指针是为了更清楚的表明我对于内存四区的见解,是想让大家明白,内存四区是什么?栈区,堆区和全局区之间的关系! 正如同在栈区和在堆区分配的内存空间是不同的!指针里存的是地址,地址是哪里的地址?是内存上的地址!而如果我们分不清我们的指针到底指向的是哪一个区域的地址,调用起来岂不是很麻烦.比如我们在子函数上分配了一个变量(栈

Java中堆区 | 栈区 | 方法区

JVM虚拟机 寄存器: 最快的存储区,位于处理器内部,但是数量极其有限.所以寄存器根据需求进行自动分配,无法直接人为控制 堆区: 位于RAM当中,一种通用的内存池.其中存放的数据由JVM自动进行管理. jvm只有一个堆区(heap)被所有线程共享,只存放对象本身. 又称动态内存分配,当需要一个对象时,使用new写一行代码,当执行这行代码时,会自动在堆里进行存储分配. 使用完毕之后,会在垃圾回收器空闲的时候尽心那个回收. 栈区: 位于RAM当中,通过堆栈指针可以从处理器获得直接支持.堆栈指针向下移

【C语言】程序内存四区

1.栈区(临时区)(stack) 由编译器自动分配释放,存放函数的参数值,局部变量的值等: 2.堆区(heap) 一般由程序员分配释放(动态内存申请与释放),若程序员不释放,程序结束时可能有操作系统回收: 3.全局区(静态区)(static) 全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,该区域在程序结束后由操作系统释放: 常量区——字符串常量和其他常量的存储位置,程序结束后由操作系统释放: 4.程序代码区

科普文:C++内存四区详细介绍

C++内存四区是哪四区?C++内存四区分为代码区.全局区.栈区.堆区,下面我们分别介绍详细介绍. 1.代码区 存放 CPU 执行的机器指令.通常代码区是可共享的(即另外的执行程序可以调用它),使其可共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可.代码区通常是只读的,使其只读的原因是防止程序意外地修改了它的指令.另外,代码区还规划了局部变量的相关信息.推荐了解传智播客C++工程师培训课程. 总结:你所写的所有代码都会放入到代码区中,代码区的特点是共享和只读. 2.全局区 全局区中主

转 方法区(method) )、栈区(stack)和堆区(heap)之JVM 内存初学

JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) 堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令) 2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身 栈区: 1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中 2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问. 3.栈分为3个

浅析栈区和堆区内存分配的区别

以下是对栈区和堆区内存分配的区别进行了详细的分析介绍,需要的朋友可以过来参考下 一直以来总是对这个问题的认识比较朦胧,我相信很多朋友也是这样的,总是听到内存一会在栈上分配,一会又在堆上分配,那么它们之间到底是怎么的区别呢?为了说明这个问题,我们先来看一下内存内部的组织情况. 从上图可知,程序占用的内存被分了以下几部分. 1.栈区(stack)由编译器自动分配释放 ,存放函数的参数值,局部变量的值等,内存的分配是连续的,类似于平时我们所说的栈,如果还不清楚,那么就把它想成数组,它的内存分配是连续分

Java把内存划分为4个部分 1. 代码区 1、栈区 3、堆区 4、静态区域

1.栈区(stacksegment)—由编译器自动分配释放,存放函数的参数值,局部变量的值等,具体方法执行结束之后,系统自动释放JVM内存资源 2.堆区(heapsegment)—一般由程序员分配释放,存放由new创建的对象和数组,jvm不定时查看这个对象,如果没有引用指向这个对象就回收 3.静态区(datasegment)—存放全局变量,静态变量和字符串常量,不释放 4.代码区(codesegment)—存放程序中方法的二进制代码,而且是多个对象共享一个代码空间区域

浅析栈区和堆区内存分配的区别(转)

以下是对栈区和堆区内存分配的区别进行了详细的分析介绍,需要的朋友可以过来参考下 一直以来总是对这个问题的认识比较朦胧,我相信很多朋友也是这样的,总是听到内存一会在栈上分配,一会又在堆上分配,那么它们之间到底是怎么的区别呢?为了说明这个问题,我们先来看一下内存内部的组织情况. 从上图可知,程序占用的内存被分了以下几部分. 1.栈区(stack)由编译器自动分配释放 ,存放函数的参数值,局部变量的值等,内存的分配是连续的,类似于平时我们所说的栈,如果还不清楚,那么就把它想成数组,它的内存分配是连续分

内存四区-常量区

用代码例子看一个数据区中常量区: #include <stdio.h>#include <stdlib.h> char *getStr1(){ char *pstr1 = "adfag";//pstr1是局部变量,在声明时入栈,函数结束后出栈  return pstr1;} char *getStr2(){ //因为 getStr1和getStr2二个函数中的字符串一样,C++编译器会对代码做优化,在数据区的常量区只保留一份字符串,即 pstr1和pstr2指向