CSAPP學習日誌 棧的分配

2021-09-24 01:42:08 字數 3669 閱讀 3142

這是乙個關於深度遞迴的例子。

先上**:

/* example of deep recursion */

#include

#include

intrecurse

(int x)

intmain

(int argc,

char

*ar**)

執行結果如下:

不帶引數的執行結果:

gec@ubuntu:/mnt/hgfs/gx$ ./runaway

x = 100. a at 0xbffcb040

x = 99. a at 0xbffab020

x = 98. a at 0xbff8b000

x = 97. a at 0xbff6afe0

x = 96. a at 0xbff4afc0

x = 95. a at 0xbff2afa0

x = 94. a at 0xbff0af80

x = 93. a at 0xbfeeaf60

x = 92. a at 0xbfecaf40

x = 91. a at 0xbfeaaf20

x = 90. a at 0xbfe8af00

x = 89. a at 0xbfe6aee0

x = 88. a at 0xbfe4aec0

x = 87. a at 0xbfe2aea0

x = 86. a at 0xbfe0ae80

x = 85. a at 0xbfdeae60

x = 84. a at 0xbfdcae40

x = 83. a at 0xbfdaae20

x = 82. a at 0xbfd8ae00

x = 81. a at 0xbfd6ade0

x = 80. a at 0xbfd4adc0

x = 79. a at 0xbfd2ada0

x = 78. a at 0xbfd0ad80

x = 77. a at 0xbfcead60

x = 76. a at 0xbfccad40

x = 75. a at 0xbfcaad20

x = 74. a at 0xbfc8ad00

x = 73. a at 0xbfc6ace0

x = 72. a at 0xbfc4acc0

x = 71. a at 0xbfc2aca0

x = 70. a at 0xbfc0ac80

x = 69. a at 0xbfbeac60

x = 68. a at 0xbfbcac40

x = 67. a at 0xbfbaac20

x = 66. a at 0xbfb8ac00

x = 65. a at 0xbfb6abe0

x = 64. a at 0xbfb4abc0

x = 63. a at 0xbfb2aba0

x = 62. a at 0xbfb0ab80

x = 61. a at 0xbfaeab60

x = 60. a at 0xbfacab40

x = 59. a at 0xbfaaab20

x = 58. a at 0xbfa8ab00

x = 57. a at 0xbfa6aae0

x = 56. a at 0xbfa4aac0

x = 55. a at 0xbfa2aaa0

x = 54. a at 0xbfa0aa80

x = 53. a at 0xbf9eaa60

x = 52. a at 0xbf9caa40

x = 51. a at 0xbf9aaa20

x = 50. a at 0xbf98aa00

x = 49. a at 0xbf96a9e0

x = 48. a at 0xbf94a9c0

x = 47. a at 0xbf92a9a0

x = 46. a at 0xbf90a980

x = 45. a at 0xbf8ea960

x = 44. a at 0xbf8ca940

x = 43. a at 0xbf8aa920

x = 42. a at 0xbf88a900

x = 41. a at 0xbf86a8e0

x = 40. a at 0xbf84a8c0

x = 39. a at 0xbf82a8a0

x = 38. a at 0xbf80a880

段錯誤 (核心已轉儲)

帶引數的執行結果:

gec@ubuntu:/mnt/hgfs/gx$ ./runaway 20

x = 20. a at 0xbfef9460

x = 19. a at 0xbfed9440

x = 18. a at 0xbfeb9420

x = 17. a at 0xbfe99400

x = 16. a at 0xbfe793e0

x = 15. a at 0xbfe593c0

x = 14. a at 0xbfe393a0

x = 13. a at 0xbfe19380

x = 12. a at 0xbfdf9360

x = 11. a at 0xbfdd9340

x = 10. a at 0xbfdb9320

x = 9. a at 0xbfd99300

x = 8. a at 0xbfd792e0

x = 7. a at 0xbfd592c0

x = 6. a at 0xbfd392a0

x = 5. a at 0xbfd19280

x = 4. a at 0xbfcf9260

x = 3. a at 0xbfcd9240

x = 2. a at 0xbfcb9220

x = 1. a at 0xbfc99200

x = 20. recurse(x) = -20

上述程式的執行結果可以說明:

在遞迴過程中,計算機內部不斷呼叫新的儲存空間,但儲存空間有限,不斷的遞迴導致新產生的資料覆蓋原有的資料,阻斷了程式返回的途徑,最後產生錯誤。

在當最後棧的分配到達最大值時,就會發生段錯誤,致使程式異常終止。因此,該程式可以用來判斷棧的分配的空間的大小

思考練習以下命令:

-d:將**段反彙編

-s:將**段反彙編的同時,將反彙編**和源**交替顯示,編譯時需要給出-g,即需要除錯資訊。

-l:反彙編**中插入源**的檔名和行號。

-j section:僅反彙編指定的section。可以有多個-j引數來選擇多個section。

objdump -d a.out # 簡單反彙編

objdump -s a.out # 反彙編**中混入對應的源**

objdump -j .text -l -s a.out # 列印源檔名和行號

CSAPP第十章學習日誌

乙個linux檔案就是乙個m個位元組的序列,所有的i o裝置 例如網路 磁碟和終端 都被模式化為檔案,而所有的輸入和輸出都被當做對此項對應的檔案的讀和寫來進行執行。這種裝置優雅的對映為檔案的方式,允許linux核心引出乙個簡單的 低階的應用介面,稱為unix i o,這使得所有的輸入和輸出都能以一種...

記憶體的堆分配和棧分配

記憶體的堆分配和棧分配 備註 這一部分非常重要,如果錯誤請及時告知。謝謝 這裡是完全參考其他部落格。c 記憶體模型 1 棧區 由編譯器自動分配和釋放,存放函式的引數數值,區域性變數的值 其操作方式類似於資料結構中的棧 2 堆區 一般由使用者分配和釋放,若使用者不釋放,程式結束時候由os 它與資料結構...

記憶體的堆分配和棧分配

c 記憶體模型 1 棧區 由編譯器自動分配和釋放,存放函式的引數數值,區域性變數的值 其操作方式類似於資料結構中得棧 2 堆區 一般由使用者分配和釋放,若使用者不釋放,程式結束時候由os 它與資料結構中堆是兩回事,分配方式類似鍊錶 3 全域性區 靜態區 static 全域性變數和靜態變數的存放區域。...