精华内容
下载资源
问答
  • 数组堆还是栈

    千次阅读 2020-02-19 19:54:05
    看以下代码: char * str ( char ch ...由此问题在于函数运行结束后,会自动释放函数中数组的值,像是临时变量。...静态数组在函数里声明 ...3) 固定数组在类声明------》 4)动态数组 -------》

    看以下代码:

    char *str(char ch[],int n)
    {
    	char temp[80] = {0};
    	for (int i = 0; i < n; i++)
    		temp[i] = ch[i];
    	return temp;
    }
    char *arr1=new char[3];
    arr1 = arr("hello", 3);
    
    cout << arr1 << endl;
    

    再调用后如下:
    在这里插入图片描述在打入断点后,让刚执行完arr1 = arr(“hello”,3)
    内存的值为“hel”,但明显红色值,说明有问题。
    在这里插入图片描述
    继续调试,值完全无效。
    在这里插入图片描述
    由此问题在于函数运行结束后,会自动释放函数中数组的值,像是临时变量。
    静态数组在函数里声明是存放在中的,函数运行完毕,程序自动会释放
    于是我将它改成用new,代码如下:

    char * arr(const char ch[], int n)
    {
    	int i;
    	char *t = new char[n + 1];
    	for (i=0 ; i < n; i++)
    		t[i] = ch[i];
    
    	while (i <= n)
    		t[i++] = '\0';
    	
    	cout << &t << endl;
    
    	return t;
    }
    

    这样成功运行并得到我们期望的结果。
    在这里插入图片描述
    总结:
    1)固定数组在函数体内声明------》栈
    2)固定数组为全局变量-----》堆
    3) 固定数组在类中声明------》堆
    4)动态数组 -------》堆

    展开全文
  • 在进入讲解主题“-内存与内存的区别”之前,先来讲解一下数组,所谓数组,就是若干个相同数据类型的元素按一定顺序排列的集合。 一维数组的定义: 数据类型[ ] 数组名; 数组名 = new 数据类型[个数]; 针对于...

    Java数组
    在进入讲解主题“-栈内存与堆内存的区别”之前,先来讲解一下数组,所谓数组,就是若干个相同数据类型的元素按一定顺序排列的集合。
    一维数组的定义:
    数据类型[ ] 数组名;
    数组名 = new 数据类型[个数];

    针对于Java数组,Java语言把内存分为两种:-栈内存和堆内存。
    栈内存:
    在方法中定义的一些基本类型的变量和对象的引用变量都在方法的栈内存中分配,当在一段代码块中定义一个变量时,Java就在栈内存中为这个变量分配内存空间,当超出变量的作用域后,Java会自动释放掉为该变量所分配的内存空间。
    堆内存:
    堆内存用来存放 new 运算符创建的对象和数组,在堆中分配的内存,由Java虚拟机的自动垃级回收器来管理。在堆中创建了一个数组或对象后,同时还在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,引用变量实际上保存的是数组或对象在堆内存中的首地址(也称为对象的句柄),以后就可以在程序中使用栈的引用变量访问堆中的数组或对象。引用变量就相当于是为数组或对象起的一个名称。引用变量是普通的变量,定义时在找中分配,引用变量在程序运行到其作用域之外后被释放。而数组或对象本身在堆内存中分配,即使程序运行到使用new运算符创建数组或对象的语句所在的代码块之外,数组或对象本身所占据的内存也不会释放,数组或对象在没有引用变量指向它时,会变为垃圾,不能再被使用,但仍然占据内存空间不放,在随后一个不确定的时间被垃圾回收器收走(释放掉),这也是Java比较占内存的原因。
    小结:
    1 栈:为编译器自动分配和释放,如函数参数、局部变量、临时变量等等
    2 堆:为成员分配和释放,由程序员自己申请、自己释放。否则发生内存泄露。典型为使用 new 申请的堆内容。
    为了方便理解,举个例子:
    如: int [ ] x; //定义了一个数组x,这条语句执行完成后的内存状态如图1
    x = new int [10]; //数组初始化,这条语句执行完成后的内存状态如图2
    图1.只声明了数组,而没有对其分配内存空间图1.只声明了数组,而没有对其分配内存空间
    图2.声明数组并分配相应的内存空间,引用变量指向数据对象图2.声明数组并分配相应的内存空间,引用变量指向数据对象

    执行第2条语句"x=new int [10];“后,在堆内存中创建了一个数组对象,为这个数组对象分配了10个整数单元,并将数组对象赋给了数组引用变量x,引用变量就相当于C语言中的指针变量,而数组对象就是指针变量指向的那个内存块。所以说在Java内部还是有指针的,只是把指针的概念对用户隐藏起来了,而用户所使用的是引用变量。
    用户也可以改变x的值,让它指向另外一个数组对象,或者不指向任何数组对象。要想让x不指向任何数组对象,只需要将常量 null 赋给x即可。如x=null;,这条语句执行完后的内存状态如图3所示。
    执行完"x=null;”,语句后,原来通过new int [10]产生的数组对象不再被任何引用变量所引用,变成了“孤儿”,也就成了垃圾,直到垃圾回收器来将它释放掉.
    图3.引用变量与引用对象断开
    图3.引用变量与引用对象断开

    栈内存与堆内存的区别讲述完毕,迷路的你,是否看到了些许光芒。
    为每一个不死心的明天而拼命的今天,都是2019年11月19日21点24分。
    刚刚结束今天的马原期中,Java加油啊!

    展开全文
  • 初学者对java数组中栈的认识

    千次阅读 2017-05-19 12:54:58
    java数组中
    public static void main(String[] args) {
    
            String[] Array = null;
            Array = new String[3];
            Array[0] = "安徽合肥";
            Array[1] = "江苏苏州";
            Array[2] = "安徽铜陵";
    
            for(int i=0;i<=2;i++){
                System.out.println(Array[i]);
    
            }
        }
        以上代码是对数组简单的声明及内存分配的小实例,简单的实现了数组的应用。接下来想和大家分享的是数组在内存中的存放形式,以及在数组中栈和堆的关系。首先给出结论:数组引用变量(即Array变量)是存放在栈内存中,数组元素(即Array[0]、Array[1]等元素)是存放在堆内存中,通过栈内存中的指针指向对应元素的在堆内存中的位置来实现访问,以下图来说明数组此时的存放形式。
    

    这里写图片描述

       在java中,当执行方法时,该方法都会建立自身的内存栈,以用来将该方法内部定义的变量逐个加入到内存栈中,当执行结束时方法的内存栈也随之销毁,所有变量存放在栈内存中,即随着寄存主体的消亡而消亡;反之,当我们创建一个对象时,这个对象被保存到运行时数据区中,即存放在堆空间中,以便反复利用(因为创建成本很高),此时不会随着执行方法的结束而消亡,同时该对象还可被其他对象所引用,只有当这个对象没有被任何引用变量引用时,才会在垃圾回收在合适的时间点回收。
    
    展开全文
  • 数组存储在栈中还是堆

    万次阅读 2015-08-31 09:53:45
    今天看代码,定义了一个结构体 typedef struct {  int a;  int b;  int char[6*1024];... 我的第一反应是,怎么可以定义这么大数据,容易把搞死(理由:数组保存在空间)。 哎...忘了是

    今天看代码,定义了一个结构体

    typedef struct {

        int a;

        int b;

        int char[6*1024];

    } ss_t;

    //定义一个指针

    ss_t *sTmp = NULL;

    sTmp = malloc(sizeof(ss_t));

     我的第一反应是,怎么可以定义这么大数据,容易把栈搞死(理由:数组保存在栈空间)。

    哎...忘了是由malloc产生的,根本就是生成在堆上。

     

    但是这样结构体定义变量时就会容易出现栈资源专用严重问题,如下:

    ss_t tmp;

    这样一个变量就占用了6K多栈资源,就不合理了。定义改为如下

    typedef struct {

        int a;

        int b;

        int char* buf

    } ss_t;

    定义变量 ss_t  tmp;再使用malloc申请 buf 就更为合理。
    展开全文
  • Java中对象到底存在堆中还是栈中

    千次阅读 2020-07-30 14:50:02
    创建一个对象的时候,到底是在栈中分配还是中分配需要看2个方面:对象类型和在Java中存在的位置 1.如果是基本数据类型,byte、short、int、long、float、double、char,如果是在方法中声明,则存储在栈中,其它...
  • JAVA中数组的内存(

    千次阅读 2017-02-01 19:51:45
    JAVA对内存空间的划分五部分: 方法区 本地方法区 寄存器今天主要谈和堆栈内存:存储的都是局部变量。 只要是在方法定义的变量都是局部变量,一旦变量的生命周期结束,该变量就被释放。 (压栈弹 ...
  • 数组是分配在栈中

    千次阅读 2018-07-03 18:02:00
    关于JAVA,下面说法...数组是分配在栈中的 对象所占的内存是由自动内存管理系统回收 JVM 关于和栈 Java 把内存划分成两种:一种是栈内存,另一种是内存。 栈式存储: 在函数中定义的一些基本类型的变量...
  • 数组内存分配之

    万次阅读 多人点赞 2017-01-14 20:03:40
    首先看一下数组数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。 数组既可以存储基本数据类型,也可以存储引用数据类型。 数组的定义格式: 格式1:数据类型[] 数组名;int[] a:定义一个int...
  • 注意:与数据结构是两回事,分配方式类似链表 全局区(静态区-stack) 全局变量和静态变量是存储在一起的 程序结束后由系统释放 文字常量区 常量字符串就放在这里,程序结束后由系统释放 双引号 程序代码区 ...
  • 将复杂数据类型放在堆中的目的是为了不影响栈的效率,而是通过引用的方式去堆中查找。 简单数据类型比较稳定,并且它只占据很小的内存,讲它放在空间小、运算速度快的栈中,能够提高效率。 ...
  • String存放在堆中还是栈中

    千次阅读 2018-07-20 16:42:10
    1) 栈中开辟一块空间存放引用str1, 2) String池中开辟一块空间,存放String常量"abc", 3) 引用str1指向池中String常量"abc", 4) str1所指代的地址即常量"abc"所在地址,输出为...
  • Java基础-数组在堆栈的储存

    千次阅读 2018-11-20 16:53:48
    内存的实体是用来封装数据的,内存的实体都有默认的初始值(不主动给他赋值的情况下),默认值则由数组中元素的类型而定,int型数组默认是0,double是 0.0,float 0.0f,boolean为 false. 只有引用数据类型,...
  • javascript数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性,索引可能是整数,然而,这些整数索引在javascript内部被转换成字符串类型了,这是因为javascript对象的属性必须是字符串类型,...
  • 数组在jvm的存储

    千次阅读 2017-03-17 10:14:14
    Java数组在内存是如何存放的 阅读目录 一维数组二维数组数组对象及其引用存放在内存的哪里? Java有两种类型的数组: 基本数据类型数组;对象数组; 当一个对象使用关键字“new”创建时,会在...
  • 数组操作常见问题5. 一维数组内存图解6. 一维数组练习二、二维数组1. 二维数组概述及格式2. 二维数组内存图解3. 二维数组练习三、递归1. 递归概述2. 递归思想图解3.递归练习 一、一维数组 1. 一维数组概念及定义...
  • new创建对象,对象保存在堆还是栈

    万次阅读 多人点赞 2017-03-25 21:26:52
    new创建对象,对象保存在堆还是栈? -->内存是用来存放由new创建的对象和数组,即动态申请的内存都存放在内存 -->内存是用来存放在函数定义的一些基本类型的变量和对象的引用变量 例子:局部...
  • Java程序中新建的对象一般都是存放在中,而JVM是基于栈的架构,每个线程都会有一个虚拟机栈,而虚拟机栈中有着一个个的栈帧,每一个栈帧对应着一个方法,每个栈帧中都有着局部变量表,操作数栈,动态连接,返回...
  • 链表与数组的区别及的区别

    千次阅读 2010-05-22 16:25:00
    链表与数组的区别A 从逻辑结构来看A-1. 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当 数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。... (静态)数组栈中
  • 如果需要在上创建对象,要么使用new运算符,要么使用malloc系列函数。这点没有异议。 真正有异议的是下面的代码: Object obj; 此时,obj是在上分配的吗? 要回答这个问题,我们首先要理解这个语句是什么...
  • java用数组实现

    2020-08-16 16:26:35
    根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。 出栈(pop)和入栈(push)的概念: 栈的应用场景: 子程
  • 局部变量的特点:有作用域,一旦超出作用域,就立刻从栈中消失。 2.(Heap) 凡是new出来的东西,都存在于中。 内存中的东西都有一个16进制的地址值。 内存里存放的数据都有默认的值; —整数的默认值为0 ...
  • 一.数组越界的经典案列 我们先来看一段代码: #include<stdio.h>...因为栈是从高地址往低地址扩展,也就是先入的数据在高地址,i定义在arr之前,先被压入栈中在高地址,而数组栈中是从低地址往高地
  • jvm的理解

    万次阅读 2018-08-30 00:44:20
     在中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。     引用变量就相当于是为数组或对象...
  • 区:  1.存储的全部是对象,每个对象都包含一个与之对应的...1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在区中 2.每个栈中的数据(原始类型和对象引用...
  • c语言中堆,,数组的增长方向

    千次阅读 2016-12-07 17:33:13
    c语言中堆,,数组的增长方向这个问题在C语言是个重点问题,也是个难点问题,接下来我们谈谈他们在内存的增长问题: 如何判断的增长方向? 对于一个用惯了i386系列机器的人来说,这似乎是一个无聊的...
  • 最大区别就在于,从栈中申请内存,在使用完后无需释放,但是从中申请内存,使用完以后必须释放! 注意:从中申请内存,是有可能失败的,所以要加上对于申请内存是否成功的判断! 二. 访问对象成员的区别 ...
  • 如果一个数组并不是全局数组,他的作用域就只在main函数里面,为什么还要写在main函数的外面呢? 之前一直不大理解,一直都图方便在main函数里面对数组进行定义。直到一次运行的时候,代码并没有问题,但是每次运行...
  • 内存、内存、方法区

    千次阅读 2019-07-18 16:25:51
    Java虚拟机在执行Java程序的过程会把它所管理的内存划分为若干不同的数据区域,这些区域都有各自的用途以及创建和销毁的时间。Java虚拟机所管理的内存会包括以下几个运行时数据区域,如下图所示: 这里主要介绍...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 72,979
精华内容 29,191
关键字:

数组放在堆中还是栈中