1 1。關於內存(程序的執行需要內存的支持) 2 (1)內存本身在物理上是硬件器件,由操作系統提供 3 (2)內存的管理最終由操作系統統一管理。為了能過便捷的管理內存(酒店管理房間 是不是分很多不同的類型和待遇呢),同樣操作系統提供了多種的機制來讓了多種機制來讓我們應用程序使用內存。這些機制彼此不同,各自有各自的特點,我們程序根據自己的實際情況來選擇某種方式獲取內存(在操作系統處登記這塊內存的臨時使用權限)、使用內存、釋放內存(向操作系統歸還這塊內存的使用權限)。也就是在進入酒店拿到鑰匙或者卡,然后就可以進入一個編號為XX的房間,也就是你此時有臨時的使用權限比如為一晚,第二天時間一到你就的歸還鑰匙或者卡,也就是釋放內存。 4 2。C語言能夠獲取內存的三種方式: 5 棧 堆 數據區 6 3。關於棧 7 spec1: 8 運行的時候自動分配而且自動回收,程序員不用人工的去干預 9 spec2:反復使用 10 棧內存在程序中就是一塊空間 程序反復使用這塊空間 11 spec3:臟內存 12 為啥是臟的呢,反復使用,使用了就算了還不去清理,操作系統也不會幫你打理,哪有大哥給你做飯還洗碗的。因此分配到的時候保留的是原來的值,所以啊,變量定義最好初始化,不然出事兒都不知道啥情況 13 spec4:臨時的(函數不能返回棧變量的指針,因為這個空間是臨時的,注意了,很多時候我們想得到變量的地址,取出來用指針指向它,然后操縱它,但是這個之后,一旦其他的函數因為也是在棧中,很有可能就會取代剛才那塊空間,這樣就得不到理想的結果) 14 程序一執行完,你達到了目的,你就可以走了,讓給其他的人也可以用這塊空間。看看,多么人性化 15 16 #include <stdio.h> 17 18 19 // 函數不能返回函數內部局部變量的地址,因為這個函數執行完返回后這個局部變量已經不在了 20 // 這個局部變量是分配在棧上的,雖然不在了但是棧內存還在還可以訪問,但是訪問時實際上這個 21 // 內存地址已經和當時那個變量無關了。 22 int *func(void) 23 { 24 int a = 4; // a是局部變量,分配在棧上又叫棧變量,又叫臨時變量 25 printf("&a = %p\n", &a); 26 return &a; 27 } 28 29 void func2(void) 30 { 31 int a = 33; 32 int b = 33; 33 int c = 33; 34 printf("in func2, &a = %p\n", &a); 35 } 36 37 void stack_overflow(void) 38 { 39 int a[10000000] = {0}; 40 a[10000000-1] = 12; 41 } 42 43 void stack_overflow2(void) 44 { 45 int a = 2; 46 stack_overflow2(); 47 } 48 49 50 int main(void) 51 { 52 //stack_overflow(); 53 stack_overflow2(); 54 /* 55 int *p = NULL; 56 p = func(); 57 func2(); 58 func2(); 59 printf("p = %p\n", p); 60 61 printf("*p = %d.\n", *p); // 證明棧內存完了后是臟的 62 */ 63 return 0; 64 }
學習筆記,嘻嘻,感覺不錯。勿噴~~