スタックとスタックの違い(経典転載博文)


 、    ―        

   c/C++                   

1、  (stack)―              ,        ,       。               。 

2、  (heap) ―             ,        ,        OS   。               ,           ,  。 

3、   (   )(static)―,                  ,                  ,                             。 -            

4、       ―            。            

5、     ―           。 

 、     

        ,     

//main.cpp 

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"       。 

} 

 、         

2.1     

stack: 

       。   ,             int b;         b     

heap: 

         ,     , c malloc   

 p1 = (char *)malloc(10); 

 C++  new    

 p2 = (char *)malloc(10); 

    p1、p2       。 

2.2 

         

 :               ,          ,           。 

 :                        ,           , 

      ,                  ,                ,             ,  ,       ,                       ,  ,    delete              。  ,                       ,                      。 

2.3        

 : Windows ,             ,           。                            , WINDOWS ,     2M(     1M,              ),                ,   overflow。  ,          。 

 :             ,         。                     ,       ,                 。                    。    ,          ,    。 

2.4       : 

        ,    。          。 

   new     ,       ,          ,        . 

  , WINDOWS ,       VirtualAlloc    ,     ,                       ,         。     ,    。 

2.5          

 :       ,                  (               )   ,          ,     C    ,          ,           。           。 

          ,       ,     ,               ,             ,         。 

 :                   。             。 

2.6        

char s1[] = "aaaaaaaaaaaaaaa"; 

char *s2 = "bbbbbbbbbbbbbbbbb"; 

aaaaaaaaaaa         ; 

 bbbbbbbbbbb         ; 

  ,       ,                (   ) 。 

  : 

#include 

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    ,    。 

2.7  : 

                 : 

             ,    (    )、  、  (  ),     ,      、          、       ,       ,      。 

                 ,    ,           ,      。