堆和栈
一般认为在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.
栈是先入后出的,一般是由高地址向低地址生长。
堆栈其实还是一块内存区域,只是其分配是由系统控制.当这快区域的内存分配完,而你还要分配就会出现溢出了.(简单解释,可能有不完善的地方)
堆栈溢出就是不顾堆栈中数据块大小,向该数据块写入了过多的数据,导致数据越界,结果覆盖了老的堆栈数据。
分享到:
相关推荐
在编写程序时往往因为代码不规范,而造成堆栈溢出的问题,这种问题困扰了不少编程新人,希望此文档能对你处理堆栈溢出时有所帮助
堆栈溢出漏洞原理及测试.pdf 堆栈溢出漏洞原理及测试.pdf 堆栈溢出漏洞原理及测试.pdf
unix linux 堆栈 溢出 的 问题
该实验在于分析堆栈溢出的原理和方法,并从中获取其他的溢出攻击方式
堆栈溢出技术从入门到精通,丰富的案例总结,包括基础知识、操作实践、案例讲解,值得学习
windows平台下的堆栈溢出利用技术,比较不错的一篇文章。
很多快速排序算法都采用递归算法,一旦数组过大,会出现堆栈溢出,我的算法采用循环法,避免堆栈溢出
"基于Linux的堆栈溢出攻击和防御研究" 本文主要介绍了基于Linux的堆栈溢出攻击的基本原理和防御方法。堆栈溢出攻击是一种常见的安全问题,它可以导致程序的崩溃或恶意代码的执行。Linux操作系统的堆栈结构使得其...
栈溢出获取shell 用gdb调试缓冲区溢出 初尝Linux栈溢出 用gdb调试缓冲区溢出 栈的观察
spark-overflow, Apache Spark的堆栈溢出 sparkSpark Collection 相关信息,解决方案,调试技巧和技巧,等等 PR始终欢迎 ! 分享你对 Apache Spark的了解。 知识触发器内存执行器存储器( 参考链接 提交 --verbose ( ...
Delphi测试缓冲区溢出 堆栈溢出,本程序用于堆栈溢出测试,超出6个字符的话则溢出。作者:曾繁威 于重庆学习作。输入“aaaaaaaaaaL$E”,可以溢出执行“溢出执行”按钮的代码。
缓冲区溢出的原理和实践(Phrack)在许多C语言的实现中,有可能通过写入例程 中所声明的数组的结尾部分来破坏可执行的堆栈.所谓'践踏堆栈'使用的 代码可以造成例程的返回异常,从而跳到任意的地址.这导致了一些极为 险恶...
◆ 了解堆栈缓冲区溢出的基本原理及其危害。 ◆ 体会远程缓冲区溢出的常见攻击手法。 ◆ 树立安全编程的思想,从根本上杜绝缓冲区溢出的发生。 [实验环境] ◆ 网络:局域网环境。 ◆ 远程计算机 ◇ 操作系统:...
Win32_Stack_Overflow
英文论文 介绍stack缓冲区攻击的检测和处理
MSP430_C语言编程的程序堆栈溢出分析
使用SoCLI,您可以在不离开终端的情况下搜索和浏览堆栈溢出。 只需使用socli命令:安装支持的平台Li SoCLI用python编写的Stack over命令行。 使用SoCLI,您可以在不离开终端的情况下搜索和浏览堆栈溢出。 只需使用...
通过列举linux平台下的例子,并结合gdb描述了堆栈溢的过程。
Linux上使用包裹函数防止堆栈溢出攻击的研究.pdf