关于堆栈【欧洲杯竞猜平台】

1栈 – 有编译器自动分配释放
2堆 – 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
3全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静
态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。

一、C语言分为几下几类:

  • 程序结束释放
    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所指向的”12345
    6″优化成一块。
    }
    还有就是函数调用时会在栈上有一系列的保留现场及传递参数的操作。
    栈的空间大小有限定,vc的缺省是2M。栈不够用的情况一般是程序中分配了大量数组和
    递归函数层次太深。有一点必须知道,当一个函数调用完返回后它会释放该函数中所有
    的栈空间。栈是由编译器自动管理的,不用你操心。
    堆是动态分配内存的,并且你可以分配使用很大的内存。但是用不好会产生内存泄漏。
    并且频繁地malloc和free会产生内存碎片(有点类似磁盘碎片),因为c分配动态内存时
    是寻找匹配的内存的。而用栈则不会产生碎片。
    在栈上存取数据比通过指针在堆上存取数据快些。
    一般大家说的和栈是一样的,就是栈(stack),而说堆时才是堆heap.
    栈是先入后出的,一般是由高地址向低地址生长。

1.栈区stack)

– 有编译器自动分配释放 2堆 –
一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
3全局区(静态区),全局变量和静态…

由编译器自动分配和释放,存放函数的函数值,局部变量的值等。操作方式类似于数据结构中的栈。

2.堆区heap)

一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。注意它同数据结构的堆是两回事,分配方式类似于链表。

3.全局区静态区static)

全局变量和静态变量的存储是放在一起的,初始化的全部变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域
。程序结束后由系统释放。

4.文字常量区

常量字符串就是放在这里的。程序结束后就由系统释放。

5.程序代码区

存放函数体的二进制代码。

#define不占用内存单元。C++编译器通常并不给const常量分配存储空间,而是把const变量的定义保存在符号表里。在VC中,const变量与一般变量一样,都分配内存空间.

在函数体中定义的变量通常是在栈上,用malloc,calloc,realloc等分配内存的函数分配得到的就是在堆上。

在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。

另外,函数中的”adgfdf”这样的字符串存放在常量区。

比如: int a = 0; //全局初始化区

char *p1; //全局未初始化区

void main() {

   int b; //栈

   char s[] = “abc”; //栈    

char *p2; //栈

   char *p3 = “123456”; //123456{post.content}在常量区,p3在栈上    

static int c = 0;
//全局静态)初始化区

   p1 = (char *)malloc(10); //分配得来得10字节的区域在堆区    

p2 = (char *)malloc(20);
//分配得来得20字节的区域在堆区    

strcpy(p1, “123456”);
//123456{post.content}放在常量区,编译器可能会将它与p3所指向的”123456″优化成一块
}

二、C++中分为以下几类:分别是堆、栈、自由存储区、全局/静态存储区和常量存储区

1.栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。

2.堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

3.自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。

4.全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。

5.常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改当然,你要通过非正当手段也可以修改)

本文出自 “IT民工一枚”
博客,请务必保留此出处

1.栈区stack)
由编译器自动分配和释放
,存放函数的函数值,局部变量的值等。操作方式类似于数据结构中的栈…

相关文章