在线等待

解决方案 »

  1.   

    局部变量放在stack中,参数也放在stack中。静态变量与全局变量不在stack中,也不在heap中,在静态数据区中。malloc/new分配的内存/对象在heap中。
      

  2.   

    动态的分配的放在堆(heap)中,静态分配的放在栈(stack)中。
    如,你用new分配的就在堆中,而用int,double等分配的就在栈中!静态变量与全局变量既不在堆中,也不在栈中,在静态数据区中!
      

  3.   

    to 52001314(passenger)
    堆是后进先出,栈是先进先出。?????????????????????????????????用NEW申请的变量在堆中分配
    局部变量在栈中分配静态变量与全局变量到底放在堆中还是在栈中?内存分为:
      static memory//静态变量与全局变量在这里分配
        automatic memory
        free storestatic memory,in which an object is allocated by the linker for the duration of the program. Global and namespace cariables ,static class members and static variables in functions are allocated in static memory。
      

  4.   

    static memory//静态变量与全局变量在这里分配
    automatic memory//函数参数和局部变量
    free store//NEW申请的
      

  5.   

    //////////////////////////////////////////////////////////////////////////////// 
    //Author: Lei Zhengdeng 
    //E-mail: [email protected]
    //HomePage: http://arden.3322.net 
    //Date: Mar 01, 2002 
    //////////////////////////////////////////////////////////////////////////////// 
    一般认为在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分配动态内存时是寻找匹配的内存的。而用栈则不会产生碎片。 char s1[] = "aaaaaaaaaaaaaaa"; 
    char *s2 = "bbbbbbbbbbbbbbbbb"; 
    aaaaaaaaaaa是在运行时刻符值的,而bbbbbbbbbbb是在编译时就确定的 
    但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。 
    比如: 
    #include <stdio.h> 
    void main() 

    char a = 1; 
    char c[] = "1234567890"; 
    char *p ="1234567890"; 
    a = c[1]; 
    a = p[1]; 
    return; 
    } 10:   a = c[1]; 
    00401067 8A 4D F1 mov       cl,byte ptr [ebp-0Fh] 
    0040106A 88 4D FC mov         byte ptr [ebp-4],cl 
    11:   a = p[1]; 
    0040106D 8B 55 EC mov         edx,dword ptr [ebp-14h] 
    00401070 8A 42 01 mov       al,byte ptr [edx+1] 
    00401073 88 45 FC mov         byte ptr [ebp-4],al 
    第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到edx中,在根据edx读取字符,显然慢了。  一般大家说的堆栈和栈是一样的,就是栈(stack),而说堆时才是堆heap. 
    栈是先入后出的,一般是由高地址向低地址生长。 
    相关的一个图: 
    http://arden.3322.net/arrpnt.txt 
      

  6.   

    我要特别感谢大家的帮组,cwanter(小菜)说的太好了,马上加分
      

  7.   

    《Visual C++6.0技术内幕》中也有介绍