堆和栈
一般认为在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.
栈是先入后出的,一般是由高地址向低地址生长。
堆栈其实还是一块内存区域,只是其分配是由系统控制.当这快区域的内存分配完,而你还要分配就会出现溢出了.(简单解释,可能有不完善的地方)
堆栈溢出就是不顾堆栈中数据块大小,向该数据块写入了过多的数据,导致数据越界,结果覆盖了老的堆栈数据。
分享到:
相关推荐
以下是一些关于如何查找和解决IAR编译器堆栈溢出问题的详细信息: 1. **理解堆栈的工作原理**: 堆栈是内存中一块特殊的区域,用于存储函数调用的相关信息。它按照后进先出(LIFO)的原则工作,新分配的元素被压入...
【Linux堆栈溢出问题详解】 堆栈溢出是一种常见的软件安全漏洞,尤其在Linux和Unix系统中。这种漏洞允许攻击者通过向程序的堆栈区域写入超出预期的数据量来破坏程序的正常运行,从而可能获取更高的权限,如root权限...
在Windows操作系统中,堆栈溢出是一种常见的安全漏洞,它源于程序在处理栈内存时的错误,可能导致系统崩溃、数据泄露或恶意代码执行。本文将深入探讨Windows平台下的堆栈溢出利用技术,帮助读者理解这种漏洞的工作...
堆栈溢出是一种安全漏洞,通常发生在程序的堆栈区域中。堆栈是一种后进先出(LIFO)的数据结构,用于存储局部变量、参数、返回地址和其他由程序在执行期间使用的数据。堆栈在物理上是连续内存区域,其生长方向通常与...
堆栈溢出之网络攻击与防御 堆栈溢出原理 堆栈溢出是一种常见的网络攻击方式,攻击者可以通过构造精心的数据来覆盖堆块首,从而控制程序的执行流程。堆栈溢出攻击的关键是利用双向链表指针,攻击者可以通过修改双向...
### 关于堆栈溢出的白皮书:关键知识点解析 #### 一、堆栈溢出(Stack Buffer Overflow)概述 堆栈溢出是一种常见的安全漏洞利用方式,它发生在程序试图将超过预定长度的数据写入堆栈上的固定大小缓冲区时。这种...
### 堆栈溢出漏洞原理 #### 一、什么是堆栈溢出 在计算机科学领域,堆栈溢出(Stack Overflow)是一种常见的程序错误,指的是程序运行时向堆栈中填充的数据超过了堆栈能够容纳的容量。这种情况下,额外的数据会...
在IT安全领域,堆栈溢出是一种常见的软件漏洞,它发生在程序试图在栈上分配超过其实际容量的数据时。这种漏洞可能导致系统崩溃,更严重的是,攻击者可能利用它来执行任意代码,获取系统的控制权,也就是所谓的"获取...
《gflags:x86与x64架构下的堆栈溢出内存检测工具详解》 在软件开发过程中,确保程序的稳定性和安全性至关重要。而堆栈溢出是导致程序崩溃和安全漏洞的常见原因之一。为了有效地检测和预防这类问题,开发者可以使用...
堆栈溢出解决方案 堆栈溢出是软件开发中最常见的问题之一,对于软件开发人员来说,破坏了内存中的指针,及其造成的一系列难查的 bug。那么,我们应该怎么办?下面是解决堆栈溢出的知识点: 一、什么是堆栈溢出? ...
当递归深度过大,即函数调用过多时,堆栈空间会被耗尽,从而引发堆栈溢出错误。这个问题在处理大型数组时尤为突出,因为快速排序在最坏情况下需要O(n²)的递归深度,尽管平均情况下的时间复杂度是优秀的O(n log n)。...
"基于Linux的堆栈溢出攻击和防御研究" 本文主要介绍了基于Linux的堆栈溢出攻击的基本原理和防御方法。堆栈溢出攻击是一种常见的安全问题,它可以导致程序的崩溃或恶意代码的执行。Linux操作系统的堆栈结构使得其...
### Win32堆栈溢出入门详解 #### 缓冲区溢出原理与实践 **缓冲区溢出**是计算机安全领域中一个重要的概念,尤其是在Win32平台上的软件开发中,这一问题尤为突出。当程序试图将更多的数据写入比分配的空间更大的...
C程序编写的堆栈溢出 C程序编写的堆栈溢出是指在缓冲区溢出攻击中,通过覆盖保存在堆栈中的数据来达到跳转到指定函数的目的。这种攻击方式通常用于绕过系统安全机制,控制程序流程。 堆栈溢出的原理是基于程序调用...
《Delphi中的缓冲区溢出与堆栈溢出:深入理解与防范》 在软件开发领域,特别是使用Delphi这样的编程语言时,了解并掌握缓冲区溢出和堆栈溢出的概念及其潜在风险至关重要。本篇文章将深入探讨这两个概念,以及如何...
堆栈溢出是一种常见的安全漏洞,它涉及到程序执行过程中堆栈空间的管理。在本文档“堆栈溢出技术从入门到高深.doc”中,主要讲解了堆栈的原理、堆栈溢出的产生以及如何利用堆栈溢出来控制程序执行流程。 首先,堆栈...
spark-overflow, Apache Spark的堆栈溢出 sparkSpark Collection 相关信息,解决方案,调试技巧和技巧,等等 PR始终欢迎 ! 分享你对 Apache Spark的了解。 知识触发器内存执行器存储器( 参考链接 提交 --verbose ( ...
### MSP430 C语言编程中的程序堆栈溢出分析 #### 一、引言 在嵌入式系统开发中,MSP430作为一款低功耗且高性能的单片机,因其卓越的性能而备受开发者的青睐。随着越来越多原本熟悉8051单片机及其KEIL C51编译器的...