社区
C#
帖子详情
堆与栈的区别?
tangxd
2002-11-15 11:44:54
理论定义?
生命周期?
管理区别?
...全文
138
2
打赏
收藏
堆与栈的区别?
理论定义? 生命周期? 管理区别?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
2934046
2002-11-15
打赏
举报
回复
一个是先进先出,一个是先进后出
coolcating
2002-11-15
打赏
举报
回复
一般认为在c中分为这几个存储区
1栈 - 有编译器自动分配释放
2堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
3全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束释放
4另外还有一个专门放常量的地方。 - 程序结束释放
在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,函数中的"adgfdf"这样的字符串存放在常量区。
比如:
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc";栈
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一块。
}
还有就是函数调用时会在栈上有一系列的保留现场及传递参数的操作。
栈的空间大小有限定,vc的缺省是2M。栈不够用的情况一般是程序中分配了大量数组和递归函数层次太深。有一点必须知道,当一个函数调用完返回后它会释放该函数中所有的栈空间。栈是由编译器自动管理的,不用你操心。
堆是动态分配内存的,并且你可以分配使用很大的内存。但是用不好会产生内存泄漏。并且频繁地malloc和free会产生内存碎片(有点类似磁盘碎片),因为c分配动态内存时是寻找匹配的内存的。而用栈则不会产生碎片。
在栈上存取数据比通过指针在堆上存取数据快些。
一般大家说的堆栈和栈是一样的,就是栈(stack),而说堆时才是堆heap.
栈是先入后出的,一般是由高地址向低地址生长。
/////////////////////////////////////////////////////////////////////////////////////////////////
//Author: Lei Zhengdeng
//E-mail: leizhengdeng@163.net
//Homepage: http://arden.3322.net
//Date: Nov 19, 2001
/////////////////////////////////////////////////////////////////////////////////////////////////
//One dimension
char s1[5] = "abcd";
char *p11 = "1234567";
char *p12;
static int i = 1;
int j = 0x99;
p12 = (char *)malloc(sizeof(char)*10);
| 00 |
| 00 |
| 00 |
| 01 | 0x004232e8 &i
stack
| | .....
| |
| 00 | 0x0012ff7c | | 0x00420f90
| 'd' | | 00 |
| 'c' | | '7' |
| 'b' | | '6' |
| 'a' | 0x0012ff78 s1 | '5' | 0x00420f8c
| 00 | | '4' | | |
| 42 | | '3' | | |
| 0f | | '2' | | |
| 88 | 0x0012ff74 &p11-------------> | '1' | 0x00420f88 p11 | | 0x00430134
| 00 | | |
| 43 | | |
| 01 | | |
| 10 | 0x0012ff70 &p12-------------------------------------------> | | 0x00430110 p12
| 00 |
| 00 |
| 00 |
| 99 | 0x0012ff6c &j
/////////////////////////////////////////////////////////////////////////////////////////////////
//Two dimensions
char s2[2][3] = { {'1', '2', '3'}, {'a', 'b', 'c'}};
char *p21[2];
char (*p22)[3];
char **p23;
for(int i=0; i <= 1; i++)
{
p21[i] = (char *)malloc(sizeof(char)*3);
strcpy(p21[i], "xx");
}
for( i=0; i <= 1; i++)
{
free(p21[i]);
}
p22 = s2;
p23 = (char **)malloc(sizeof(char *)*2);
for( i = 0; i <=1; i++)
{
p23[i] = (char *)malloc(sizeof(char)*3);
strcpy(p23[i], "yy");
}
for( i=0; i <= 1; i++)
{
free(p23[i]);
}
free(p23);
stack
| |
| |
| 'c' |
| 'b' | 0x0012ff7c
| 'a' | s2[1]
| '3' |
| '2' |
| '1' | 0x0012ff78 s2 s2[0]
| 00 |
| 43 | | 00 |
| 01 | | 'x |
| 10 | 0x0012ff74 &p21[1]--> | 'x' | 0x00430110
| 00 |
| 43 | | 00 |
| 01 | | 'x' | | 'c' |
| 40 | 0x0012ff70 p21 &p21[0]---> | 'x' | 0x00430140 | 'b' |
| 00 | | 'a' | 0x0012ff7b p22+1 | 00 |
| 12 | | '3' | | 43 | | 00 |
| ff | | '2' | | 00 | | 'y' |
| 78 | 0x0012ff6c &p22------------------------------> | '1' | 0x0012ff78 p22 | 70 | 0x004300d4 p23+1---> | 'y' | 0x00430070
| 00 | | 00 |
| 43 | | 43 | | 00 |
| 00 | | 00 | | 'y' |
| d0 | 0x0012ff68 &p23--------------------------------------------------------> | a0 | 0x004300d0 p23------> | 'y' | 0x004300a0
| |
| |
| |
| | 0x0012ff64
| |
| |
| |
| | 0x0012ff60
| |
| |
| |
| | 0x0012ff6c
=rand(200,90)
Java中
堆
和
栈
的
区别
在哪?.pdf
Java中
堆
和
栈
的
区别
在哪?.pdf
一文读懂
堆
与
栈
的
区别
堆
(Heap)与
栈
(Stack)是开发人员必须面对的两个概念,在理解这两个概念时,需要放到具体的场景下,因为不同场景下,
堆
与
栈
代表不同的含义。一般情况下,有两层含义: (1)程序内存布局场景下,
堆
与
栈
表示的是两种程序内存分区; (2)数据结构场景下,
堆
与
栈
表示两种常用的数据结构。 1.程序内存分区——
堆
与
栈
栈
由操作系统自动分配释放 ,用于存放函数的参数值、局部变量的值等,其操作方式类......
堆
和
栈
的
区别
,为什么要
堆
和
栈
分离?
堆
和
栈
的
区别
,为什么要
堆
和
栈
分离?
栈
是运行时的单位,而
堆
是存储的单位。在Java中一个线程就会相应有一个线程
栈
与之对应。这点很容易理解,因为不同的线程执行逻辑有所不同,因此需要一个独立的线程
栈
。而
堆
则是所有线程共享的。
栈
因为是运行单位,因此里面存储的信息都是跟当前线程(或程序)相关信息的。包括局部变量、程序运行状态、方法返回值等等;而
堆
只负责存储对象信息。
堆
和
栈
的
区别
?
堆
和
栈
是计算机内存中两个重要的数据结构,具有不同的特性和用途。以下是
堆
和
栈
之间的主要
区别
:1. 存储方式
堆
是动态分配的内存区域,存储在计算机的RAM中,可以通过new、malloc等方法进行分配和释放。而
栈
是一种静态分配的内存区域,存储在CPU中的寄存器和缓存中,由系统自动进行分配和释放。2. 空间大小
堆
的大小通常比
栈
大得多,因为
堆
可以在需要时动态增长,而
栈
的大小是固定的。在使用
堆
时,程序员需要手...
Java:
堆
和
栈
的
区别
文章目录前言一、Java
堆
栈
常见问题二、问题理解1.为什么要区分
堆
和
栈
静态分配动态分配Java中的
堆
2.
堆
和
栈
的
区别
3.为什么
堆
是线程共享的而
栈
不是?4.我们平时说的
堆
栈
信息、
堆
栈
方法区是什么?
堆
栈
信息
堆
栈
方法区总结 前言 这篇记录笔者复习Java
堆
栈
区别
一、Java
堆
栈
常见问题 在学习Java初的时候,我们便知道Java的对象都是分配在
堆
中,
栈
中只保留分配对象的引用;
堆
是各线程共享,
栈
是各线程独有,当笔者使用Java一段时间后,笔者心中产生如下的思考 为什么要分
堆
和
栈
?
堆
和
栈
的
区别
是什么? 为什
C#
111,117
社区成员
642,552
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章