[ZZ]スタックとスタックの違い


スタックとスタックの違い
 、    —       
   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  : 
                 : 
             ,    (    )、  、  (  ),     ,      、          、       ,       ,      。 
                 ,    ,           ,      。