C中的栈区&堆区

摘要:
在Windows中,堆栈是一种扩展到低地址的数据结构,是一个连续的内存区域。这句话意味着堆栈顶部的地址和堆栈的最大容量由系统预先设置。在WINDOWS下,堆栈的大小为2M。如果请求的空间超过堆栈的剩余空间,系统将提示溢出。因此,堆栈的可用空间很小。它在数据结构上不同于堆。

1、栈区(stack segment):由编译器自动分配释放,存 放函数的参数的值,局部变量的值等。在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量 是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示 overflow。因此,能从栈获得的空间较小。

2、堆区(heap segment) : 一般由程序员分配释放,若程序员不释放,程序结束时可能由系统回收 。它与数据结构中的堆是两回事。堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表 的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

3、全局区(静态区)(data segment):全局变量和静态变量的存储区域是在一起的,程序结束后由系统释放。数据区的大小由系统限定,一般很大。

4、文字常量区:常量字符串就是放在这里的, 程序结束后由系统释放。

5、程序代码区:存放函数体的二进制代码。

摘录自:http://www.slyar.com/blog/variable-overflow-static.html

所有一般需要大内存的时候会使用malloc或者calloc来得到堆区内存

有时候在函数内返回一个指针什么的,使用malloc,别返回栈区的指针

除了编译期可以知道字符串大小的,字符串指针可以不用声明长度

其他情况下字符串需声明长度

一般结构体,联合,整形等都是编译期就知道大小的,所以函数返回的时候返回其拷贝

但char[]虽然知道长度,但返回指针,因为其是在运行期才分配.

char*,int*等指针返回为指针的拷贝.

免责声明:文章转载自《C中的栈区&堆区》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇(02)mongodb 数据库与collection的基本操作一文带你熟悉Pytorch->Caffe->om模型转换流程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

java集合类笔试选择题整理含答案

1、ArrayList list=new ArrayList(20);中的list扩充几次()A. 0B. 1C. 2D. 3答案:A分析:已经指定了长度, 所以不扩容2.List、Set、Map哪个继承自Collection接口,一下说法正确的是()A. List MapB. Set MapC. List SetD. List Map Set答案:C分析...

Delphi 关于指针Pointers 和@操作符

Delphi 关于指针Pointers 和@操作符 1、指针Pointers 指针是如何工作的,例如: 1 var 2 X, Y: Integer; // X和Y是整数变量 3 P: ^Integer; // P指向一个整数 4 begin 5 X := 17; // 给X赋值 6...

C++开发必看 四种强制类型转换的总结 [转]

         一、C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:        TYPE b = (TYPE)a   二、C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。   const_cast,字面上理解就是去const属性。   static_cast,命名上理解是静态类型转换。如int转换成ch...

golang-指针,函数,map

指针普通类型变量存的就是值,也叫值类型。指针类型存的是地址,即指针的值是一个变量的地址。一个指针只是值所保存的位置,不是所有的值都有地址,但是所有的变量都有。使用指针可以在无需知道变量名字的情况下,间接读取或更新变量的值。 获取变量的地址,用&,例如:var a int 获取a的地址:&a,&a(a的地址)这个表达式获取一个指向整型...

Debug 和 Release 编译方式的本质区别

一、Debug 和 Release 编译方式的本质区别       Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。       Debug 和 Release 的真正秘密,在于一组编译选项。下面列出了分别...

C#调用C++dll,传指针释放内存问题

一、传入dll前,在C#中申请内存空间 c#里面的指针即 IntPtr 申请如下: IntPtr SrcImgData = Marshal.AllocHGlobal(length);  这种需要提前知道空间大小,否则无法确定空间大小,会导致dll内部处理时越界报错。 c#里面申请空间了,那么c++里面一般就是在这些空间里面操作了,一般不会重新分配内存,那么...