heapæ¯å ï¼stackæ¯æ ã2.stackç空é´ç±æä½ç³»ç»èªå¨åé
åéæ¾ï¼heapç空é´æ¯æå¨ç³è¯·åéæ¾çï¼heap常ç¨newå
³é®åæ¥åé
ã3.stack空é´æéï¼heapç空é´æ¯å¾å¤§çèªç±åºãå¨Javaä¸ï¼è¥åªæ¯å£°æä¸ä¸ªå¯¹è±¡ï¼åå
å¨æ å
åä¸ä¸ºå
¶åé
å°å空é´ï¼è¥ånewä¸ä¸ï¼å®ä¾åå®ï¼åå¨å å
åä¸ä¸ºå
¶åé
å°åã4.举ä¾ï¼æ°æ®ç±»å åéåï¼è¿æ ·å®ä¹çä¸è¥¿å¨æ åºãå¦ï¼Object a =null; åªå¨æ å
åä¸åé
空é´new æ°æ®ç±»å();æè
malloc(é¿åº¦); è¿æ ·å®ä¹çä¸è¥¿å°±å¨å åºå¦ï¼Object b =new Object(); åå¨å å
åä¸åé
空é´
heapåstackæä»ä¹åºå« æ æ¯ä¸ç§çº¿å½¢éåï¼å
¶æ·»å åå é¤å
ç´ çæä½åºå¨åä¸æ®µå®æãæ æç
§åè¿å
åºçæ¹å¼è¿è¡å¤çãå æ¯æ çä¸ä¸ªç»æå
ç´
ç®åçå¯ä»¥ç解为ï¼
heapï¼æ¯ç±mallocä¹ç±»å½æ°åé
ç空é´æå¨å°ãå°åæ¯ç±ä½åé«å¢é¿çã
stackï¼æ¯èªå¨åé
åéï¼ä»¥åå½æ°è°ç¨çæ¶åæ使ç¨çä¸äºç©ºé´ãå°åæ¯ç±é«åä½åå°çã
é¢å¤ç¥è¯âç¨åºçå
ååé
ä¸ä¸ªç±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å¨å¸¸éåºï¼p3å¨æ ä¸ã
static int c =0ï¼ å
¨å±ï¼éæï¼åå§ååº
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
åé
å¾æ¥å¾10å20åèçåºåå°±å¨å åºã
strcpy(p1, "123456"); 123456æ¾å¨å¸¸éåºï¼ç¼è¯å¨å¯è½ä¼å°å®ä¸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å°ç»ï¼
å åæ çåºå«å¯ä»¥ç¨å¦ä¸çæ¯å»æ¥çåºï¼
使ç¨æ 就象æ们å»é¥é¦éåé¥ï¼åªç®¡ç¹èï¼ååºç³è¯·ï¼ãä»é±ãååï¼ä½¿ç¨ï¼ï¼å饱äºå°±èµ°ï¼ä¸å¿
çä¼åèãæ´èçåå¤å·¥ä½åæ´ç¢ãå·é
çæ«å°¾å·¥ä½ï¼ä»ç好å¤æ¯å¿«æ·ï¼ä½æ¯èªç±åº¦å°ã
使ç¨å 就象æ¯èªå·±å¨æåå欢åçèè´ï¼æ¯è¾éº»ç¦ï¼ä½æ¯æ¯è¾ç¬¦åèªå·±çå£å³ï¼èä¸èªç±åº¦å¤§ã
å åæ çåºå«ä¸»è¦åï¼
æä½ç³»ç»æ¹é¢çå åæ ï¼å¦ä¸é¢è¯´çé£äºï¼ä¸å¤è¯´äºã
è¿æå°±æ¯æ°æ®ç»ææ¹é¢çå åæ ï¼è¿äºé½æ¯ä¸åçæ¦å¿µãè¿éçå å®é
ä¸æçå°±æ¯ï¼æ»¡è¶³å æ§è´¨çï¼ä¼å
éåçä¸ç§æ°æ®ç»æï¼ç¬¬1个å
ç´ ææé«çä¼å
æï¼æ å®é
ä¸å°±æ¯æ»¡è¶³å
è¿ååºçæ§è´¨çæ°å¦ææ°æ®ç»æã
è½ç¶å æ ï¼å æ ç说æ³æ¯è¿èµ·æ¥å«ï¼ä½æ¯ä»ä»¬è¿æ¯æå¾å¤§åºå«çï¼è¿çå«åªæ¯ç±äºåå²çåå éå¼è¯».
温馨提示:答案为网友推荐,仅供参考