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

    千次阅读 2020-02-19 19:54:05
    看以下代码: char * str ( char ch ...打入断点后,让刚执行完arr1 = ...1)固定数组在函数体内声明------》 2)固定数组为全局变量-----》 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加油啊!

    展开全文
  • 数组的存储特点(

    千次阅读 2019-10-07 18:10:28
    只要是方法中定义的变量都是局部变量,一旦变量的生命周期结束,该变量就被释放。 (压栈弹 balabalabala) 内存:存储的都是对象,每一个对象都有一个首地址值。内存的变量都有默认初始化值。 (不同类型不...

    JAVA对内存空间的划分

    栈内存:存储的都是局部变量。
    只要是在方法中定义的变量都是局部变量,一旦变量的生命周期结束,该变量就被释放。
    (压栈弹栈 balabalabala)

    堆内存:存储的都是对象,每一个对象都有一个首地址值。堆内存的变量都有默认初始化值。
    (不同类型不一样//int–0 double–0.0 boolean–false char –’\u0000’ string–null)
    当对象不再使用时,会被JAVA垃圾回收机制处理。

    对于: int[] arr = new int[3]; //灵魂画师粗线

    Dong

    另一个例子:

    Dong
    arr成了垃圾

    展开全文
  • 初学者对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];... 我的第一反应是,怎么可以定义这么大数据,容易把搞死(理由:数组保存在栈空间)。 哎...忘了是
  • 数组内存分配之

    万次阅读 多人点赞 2017-01-14 20:03:40
    首先看一下数组数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。 数组既可以存储基本数据类型,也可以存储引用数据类型。 数组的定义格式: 格式1:数据类型[] 数组名;int[] a:定义一个int...
  • C++ 类中的数组成员在栈还是堆

    千次阅读 2020-04-07 15:49:38
    C++ 类中的数组成员在栈还是堆区 如下 ``` class A{ public: A(){ a=new int[10];} int * a; int b[10]; } int main() { A* pa=new A[100]; } ``` pa->a 与pa->b 在堆还是栈区 编译器分配还是.....
  • 来看一个网上很流行的... //全局初始化区3 char *p1; //全局未初始化区4 main()5 {6 intb; //7 char s[] = "abc"; //8 char *p2; //9 char *p3 = "123456"; //123456\0常量区,p3在栈上。10 static int c...
  • 数组一、一维数组1. 一维数组概念及定义格式2. 一维数组的初始化1)动态初始化2)静态初始化3. Java中内存分配及堆栈的区别4. 数组操作中常见问题5. 一维数组内存图解6. 一维数组练习二、二维数组1. 二维数组概述及...
  • 数组就是个容器,里面可以存放任意类型的数  2.定义数组:1)var arr = [];  2)var arr = new Array();构造函数定义方式,如果括号中有一个整数,该正数代表的是数组的长度  3.数组长度属性:length  4...
  • 时间:2019-07-05 来源:网络资源 标签:中歌会 问题中的String指的应该是java中的String吧。这里给出的回答针对java。String是一个不可变的...String本身作为一个对象,必然是在堆上的,而String中的内容char[] va...
  • Java数组在内存中是如何存放

    千次阅读 2021-02-13 02:05:47
    Java中有两种类型的数组:基本数据类型...以上代码中,arr变量存放数组对象的引用;如果你创建了空间大小为10的整形数组,情况是一样的,一个数组对象所占的空间在堆上被分配,然后返回其引用;二维数组那么二...
  • 指针 指针(pointer)是一个值为内存地址的变量(或数据对象) 基本用法 数据类型 * 指针变量名 如 int * ptr_num ...空指针(null pointer)空指针不指向任何对象,试图使用一个指针之前首先检查是否为...
  • 作者:Java从入门到架构师来源:http://suo.im/6a8aZeJava中,字符串是特殊的。Java特别注意字符串类型,其他类型则没有这种类型。例如,要创建字符串对象,您无...
  • 数组是分配在栈中的

    千次阅读 2018-07-03 18:02:00
    关于JAVA,下面说法...数组是分配在栈中的 对象所占的内存是由自动内存管理系统回收 JVM 关于 Java 把内存划分成两种:一种是内存,另一种是内存。 式存储: 函数中定义的一些基本类型的变量...
  • (Heap):凡是new出来的东西都在堆里面,当中的数据都有默认原则;(重点) 方法区(Method Area):存放的是与.class相关的信息 本地方法区(Native Meat后的 Area):与操作系统有关 寄存器(Register):与...
  • new创建对象,对象保存在堆还是栈? -->内存是用来存放由new创建的对象和数组,即动态申请的内存都存放在堆内存 -->内存是用来存放在函数中定义的一些基本类型的变量和对象的引用变量 例子:局部变量...
  • 我们编写的程序是存放在硬盘中,硬盘中的程序是不会运行的,必须放在内存中才能运行,运行完毕后会i清空内存。 Java虚拟机要运行程序,必须要对内存进行空间的分配和管理 Java虚拟机的内存划分 为提高效率就对空间...
  • 第二部分:介绍了的区别。 (1)数据存储结构:计算机的一个概念,描述数据计算机中存储方式;常用的数据存储方式就两种:顺序存储,非顺序存储! 顺序存储就是把数据存储一块连续的存储介质(比如硬盘...
  • C++在堆区创建数组

    2021-09-05 21:07:16
    上面代码有一点需要注意的是,10这个数据在堆区,但是接收它的指针在栈区这得搞清楚 上述代码int后面写括号里面是它的初始化的值,但你要是不写任何值的话也可以,系统自动给你初始化为0 int main() { int* p = ...
  • 4. 存放的是对象,存放的是基本数据类型和中对象的引用 【因为基本数据类型的长度固定、生命周期固定】 5. 内的资源一般由程序员分配释放,若不释放可能由OS回收,分配方式类似于链表 内的资源由...
  • 数组在JVM中的存储方式

    千次阅读 2019-09-18 19:18:10
  • 存放内容

    2020-08-03 17:12:17
    栈存放的是基本数据类型 + 引用变量名 int a = 1; 这里的a和1都存放在栈中 ...这里同理,c作为引用类型的变量存放在栈中,而长度为3这个数组存放在堆中,他们之间通过地址联系,c其实存储的是这个长
  • Java基础-数组在堆栈中的储存

    千次阅读 2018-11-20 16:53:48
    内存中的实体是用来封装数据的,内存的实体都有默认的初始值(不主动给他赋值的情况下),默认值则由数组中元素的类型而定,int型数组默认是0,double是 0.0,float 0.0f,boolean为 false. 只有引用数据类型,...
  • 数组在jvm中的存储

    千次阅读 2017-03-17 10:14:14
    Java数组在内存中是如何存放的 阅读目录 一维数组二维数组数组对象及其引用存放在内存中的哪里? Java中有两种类型的数组: 基本数据类型数组;对象数组; 当一个对象使用关键字“new”创建时,会...
  • 数组到底存放在哪里  数组是一种引用数据类型,数组引用变量只是一个引用,数组元素和数组变量内存里是分开存放的。下面将深入介绍数组在内存中的运行机制。 数组引用变量只是一个引用,这个引用变量可以指向任何...
  •  先看一段简单的代码 void test() { int a[10] = {0};... int* b = malloc(10 * ...而b[0] = 0需要两条指令,因为数组b的地址存放在栈上,而数组的实际内容在堆中,需要通过上的地址间接寻址

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 107,916
精华内容 43,166
关键字:

数组存放在堆还是栈

友情链接: IIC.rar