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

    千次阅读 2020-02-19 19:54:05
    看以下代码: char * str ( char ch ...打入断点后,让刚执行完arr1 = arr(“hello”,3) ...由此问题在于函数运行结束后,会自动释放函数中数组的值,...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加油啊!

    展开全文
  • 数组存储在栈中还是堆

    万次阅读 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 就更为合理。
    展开全文
  • 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 在堆还是栈区 编译器分配还是.....

    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 在堆区还是栈区
    编译器分配还是运行期分配

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

    千次阅读 2017-05-19 12:54:58
    java数组中
  • 来看一个网上很流行的... //全局初始化区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...
  • 什么是数组? --》数组就是存储相同数据类型的一组数据 区---》new 新建的对象 区--》基本数据类型,内存地址 转载于:https://www.cnblogs.com/zhaozhaozhang/p/5754397.html...
  • Java数组在内存是如何存放的

    千次阅读 2021-02-13 02:05:47
    Java有两种类型的数组:基本数据类型数组;对象数组;当一个对象使用关键字“new”...如果你创建了空间大小为10的整形数组,情况是一样的,一个数组对象所占的空间在堆上被分配,然后返回其引用;二维数组那么二...
  • 数组内存分配之

    万次阅读 多人点赞 2017-01-14 20:03:40
    首先看一下数组数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。 数组既可以存储基本数据类型,也可以存储引用数据类型。 数组的定义格式: 格式1:数据类型[] 数组名;int[] a:定义一个int...
  • 结构体在堆区分配内存二、结构体数组1.结构体数组在栈区分配内存2.结构体数组在堆区分配内存(2种方法)总结 一、结构体 1.结构体在栈区分配内存 程序目的:定义一个结构体变量,包含姓名和年龄。 实现方式:(1)...
  • 数组是分配在栈中

    千次阅读 2018-07-03 18:02:00
    关于JAVA,下面说法...数组是分配在栈中的 对象所占的内存是由自动内存管理系统回收 JVM 关于和栈 Java 把内存划分成两种:一种是栈内存,另一种是内存。 栈式存储: 函数中定义的一些基本类型的变量...
  • 一、数组  1.数组就是个容器,里面可以存放任意类型的数  2.定义数组:1)var arr = [];  2)var arr = new Array();构造函数定义方式,如果...取出数组中的数据:数组名[下标],下标从0开始,最大下标...
  • (Heap):凡是new出来的东西都在堆里面,当中的数据都有默认原则;(重点) 方法区(Method Area):存放的是与.class相关的信息 本地方法区(Native Meat后的 Area):与操作系统有关 寄存器(Register):与...
  • Java基础-数组在堆栈的储存

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

    千次阅读 2019-10-07 18:10:28
    只要是方法定义的变量都是局部变量,一旦变量的生命周期结束,该变量就被释放。 (压栈弹 balabalabala) 内存:存储的都是对象,每一个对象都有一个首地址值。内存的变量都有默认初始化值。 (不同类型不...
  • 认识 的联系 数组 1、数组的理解: 数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名, *并通过编号的方式对这些数据进行统一的管理。 2、数组相关的...
  • Java虚拟机执行Java程序的过程会把它管理的内存划分成若干个不同的数据区域 A:: 存放的是局部变量 局部变量:方法定义或者方法声明上的变量都是局部变量。 B:: 存放的是所有new出来的东西(比如:int[] ...
  •  先看一段简单的代码 void test() { int a[10] = {0};... int* b = malloc(10 * ...而b[0] = 0需要两条指令,因为数组b的地址存放在栈上,而数组的实际内容在堆中,需要通过上的地址间接寻址
  • 我们编写的程序是存放硬盘硬盘的程序是不会运行的,必须放在内存才能运行,运行完毕后会i清空内存。 Java虚拟机要运行程序,必须要对内存进行空间的分配和管理 Java虚拟机的内存划分 为提高效率就对空间...
  • 解释定义 数据结构: 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。再简单描述一下:数据结构就是描述对象间逻辑关系的学科。...Java数组就是典型的顺序存储,链表就是非顺序存储。数
  • 数组操作常见问题5. 一维数组内存图解6. 一维数组练习二、二维数组1. 二维数组概述及格式2. 二维数组内存图解3. 二维数组练习三、递归1. 递归概述2. 递归思想图解3.递归练习 一、一维数组 1. 一维数组概念及定义...
  • 学习数据结构过程,由于连续看了数组,队列,链表等,一时混杂,下面摘取参考资料,供自己学习使用。 第一部分:介绍了数据存储结构和数据结构的区别,以及链表和数组的差异。 第二部分:介绍了的区别...
  • 数组在JVM的存储方式

    千次阅读 2019-09-18 19:18:10
  • Go的变量到底在堆还是栈中分配

    千次阅读 2017-08-25 15:23:18
    最近试着优化掉一些小对象分配,发现一个很诡异的问题:这段代码会在堆上分配对象! package main import ( "fmt" ) func main() { var a [1]int c := a[:] fmt.Println(c) } 看汇编代码 go tool ...
  • 数组在jvm的存储

    千次阅读 2017-03-17 10:14:14
    Java数组在内存是如何存放的 阅读目录 一维数组二维数组数组对象及其引用存放内存的哪里? Java有两种类型的数组: 基本数据类型数组;对象数组; 当一个对象使用关键字“new”创建时,会...
  • 创建数组的时候分配了一个地址给这个数组,如上所示,arr就是0x0011,通过arr[0]等就可以操作数组。那么当我们什么操作都不做时,整型默认是0,浮点类型默认是0.0;boolean类型初始化值false;字符类型char默认是'...
  • 函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放,内分配运算内置于处理器的指令集中,效率高,但是分配的内存容量有限。 : 又称为动态内存分配,程序运行的时候用new申请...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 204,147
精华内容 81,658
关键字:

数组在堆中还是栈中