一、存儲區(qū)域介紹
堆和棧都是動態(tài)分配內(nèi)存,,兩者空間大小都是可變的。
二,、在ubuntu系統(tǒng)中輸出信息進(jìn)行驗證
#include <stdio.h>#include <string.h>#include <stdlib.h> void before(){ } char g_buf[16];char g_buf2[16];char g_buf3[16];char g_buf4[16];char g_i_buf[]='123';char g_i_buf2[]='123';char g_i_buf3[]='123'; void after(){ } int main(int argc, char **argv){ char l_buf[16]; char l_buf2[16]; char l_buf3[16]; static char s_buf[16]; static char s_buf2[16]; static char s_buf3[16]; char *p_buf; char *p_buf2; char *p_buf3; p_buf = (char *)malloc(sizeof(char) * 16); p_buf2 = (char *)malloc(sizeof(char) * 16); p_buf3 = (char *)malloc(sizeof(char) * 16); printf('g_buf: 0x%x\n', g_buf); printf('g_buf2: 0x%x\n', g_buf2); printf('g_buf3: 0x%x\n', g_buf3); printf('g_buf4: 0x%x\n', g_buf4); printf('g_i_buf: 0x%x\n', g_i_buf); printf('g_i_buf2: 0x%x\n', g_i_buf2); printf('g_i_buf3: 0x%x\n', g_i_buf3); printf('l_buf: 0x%x\n', l_buf); printf('l_buf2: 0x%x\n', l_buf2); printf('l_buf3: 0x%x\n', l_buf3); printf('s_buf: 0x%x\n', s_buf); printf('s_buf2: 0x%x\n', s_buf2); printf('s_buf3: 0x%x\n', s_buf3); printf('p_buf: 0x%x\n', p_buf); printf('p_buf2: 0x%x\n', p_buf2); printf('p_buf3: 0x%x\n', p_buf3); printf('before: 0x%x\n', before); printf('after: 0x%x\n', after); printf('main: 0x%x\n', main); if (argc > 1) { strcpy(l_buf, argv[1]); } return 0;}
l_buf/l_buf2/l_buf3 ,,直接定義,,是由編譯器自動分配的,,存儲在棧中
三,、在Keil中針對stm32系統(tǒng)進(jìn)行驗證
#include 'delay.h'#include 'usart.h'#include 'string.h'#include <stdio.h>#include <stdlib.h>int k1 = 1;int k2;static int k3 = 2;static int k4;int main(void) {delay_init(); //延時函數(shù)初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 設(shè)置中斷優(yōu)先級分組2uart_init(115200); //串口初始化為115200 while(1){ static int m1=2, m2; int i = 1; char *p; char str[10] = 'hello'; char *var1 = '123456'; char *var2 = 'abcdef'; int *p1=malloc(4); int *p2=malloc(4); free(p1); free(p2); printf('棧區(qū)-變量地址');printf(' i:%p\r\n', &i);printf(' p:%p\r\n', &p);printf(' str:%p\r\n', str); printf('堆區(qū)-動態(tài)申請地址'); printf(' %p\r\n', p1); printf(' %p\r\n', p2); printf('\r\n.bss段\r\n');printf('全局外部無初值 k2:%p\r\n', &k2);printf('靜態(tài)外部無初值 k4:%p\r\n', &k4);printf('靜態(tài)內(nèi)部無初值 m2:%p\r\n', &m2); printf('\r\n.data段\r\n'); printf('全局外部有初值 k1:%p\r\n', &k1); printf('靜態(tài)外部有初值 k3:%p\r\n', &k3); printf('靜態(tài)內(nèi)部有初值 m1:%p\r\n', &m1); printf('\r\n常量區(qū)\r\n'); printf('文字常量地址 :%p\r\n',var1); printf('文字常量地址 :%p\r\n',var2); printf('\r\n代碼區(qū)\r\n'); printf('程序區(qū)地址 :%p\r\n',&main);}}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849501234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
四、總結(jié)通過這次學(xué)習(xí)讓我對C程序的內(nèi)存分配有進(jìn)一步的認(rèn)識,,知道一個C程序內(nèi)存包括的部分,,了解了棧和堆地址變化的不同。而且在不同系統(tǒng)中,區(qū)域內(nèi)的地址值變化不一定是相同的,。 五,、參考資料1、https://blog.csdn.net/feier7501/article/details/8564300 |
|