[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 :
:
, ( )、 、 ( ), , 、 、 , , 。
, , , 。