查看电脑中所分配栈的大小。
代码全览
/* Example of deep recursion */
#include <stdio.h>
#include <stdlib.h>
int recurse(int x) {
int a[1<<15]; /* 4 * 2^15 = 64 KB */
printf("x = %d. a at %p\n", x, a);
a[0] = (1<<14)-1;
a[a[0]] = x-1;
if (a[a[0]] == 0)
return -1;
return recurse(a[a[0]]) - 1;
}
int main(int argc, char *argv[]) {
int x = 100;
if (argc > 1)
x = atoi(argv[1]);
int v = recurse(x);
printf("x = %d. recurse(x) = %d\n", x, v);
return 0;
}
运行结果
suiyi@suiyi-virtual-machine:/mnt/hgfs/share/runaway$ ./a.out
x = 100. a at 0x7ffeb78d4f50
x = 99. a at 0x7ffeb78b4f20
x = 98. a at 0x7ffeb7894ef0
x = 97. a at 0x7ffeb7874ec0
x = 96. a at 0x7ffeb7854e90
x = 95. a at 0x7ffeb7834e60
x = 94. a at 0x7ffeb7814e30
x = 93. a at 0x7ffeb77f4e00
x = 92. a at 0x7ffeb77d4dd0
x = 91. a at 0x7ffeb77b4da0
x = 90. a at 0x7ffeb7794d70
x = 89. a at 0x7ffeb7774d40
x = 88. a at 0x7ffeb7754d10
x = 87. a at 0x7ffeb7734ce0
x = 86. a at 0x7ffeb7714cb0
x = 85. a at 0x7ffeb76f4c80
x = 84. a at 0x7ffeb76d4c50
x = 83. a at 0x7ffeb76b4c20
x = 82. a at 0x7ffeb7694bf0
x = 81. a at 0x7ffeb7674bc0
x = 80. a at 0x7ffeb7654b90
x = 79. a at 0x7ffeb7634b60
x = 78. a at 0x7ffeb7614b30
x = 77. a at 0x7ffeb75f4b00
x = 76. a at 0x7ffeb75d4ad0
x = 75. a at 0x7ffeb75b4aa0
x = 74. a at 0x7ffeb7594a70
x = 73. a at 0x7ffeb7574a40
x = 72. a at 0x7ffeb7554a10
x = 71. a at 0x7ffeb75349e0
x = 70. a at 0x7ffeb75149b0
x = 69. a at 0x7ffeb74f4980
x = 68. a at 0x7ffeb74d4950
x = 67. a at 0x7ffeb74b4920
x = 66. a at 0x7ffeb74948f0
x = 65. a at 0x7ffeb74748c0
x = 64. a at 0x7ffeb7454890
x = 63. a at 0x7ffeb7434860
x = 62. a at 0x7ffeb7414830
x = 61. a at 0x7ffeb73f4800
x = 60. a at 0x7ffeb73d47d0
x = 59. a at 0x7ffeb73b47a0
x = 58. a at 0x7ffeb7394770
x = 57. a at 0x7ffeb7374740
x = 56. a at 0x7ffeb7354710
x = 55. a at 0x7ffeb73346e0
x = 54. a at 0x7ffeb73146b0
x = 53. a at 0x7ffeb72f4680
x = 52. a at 0x7ffeb72d4650
x = 51. a at 0x7ffeb72b4620
x = 50. a at 0x7ffeb72945f0
x = 49. a at 0x7ffeb72745c0
x = 48. a at 0x7ffeb7254590
x = 47. a at 0x7ffeb7234560
x = 46. a at 0x7ffeb7214530
x = 45. a at 0x7ffeb71f4500
x = 44. a at 0x7ffeb71d44d0
x = 43. a at 0x7ffeb71b44a0
x = 42. a at 0x7ffeb7194470
x = 41. a at 0x7ffeb7174440
x = 40. a at 0x7ffeb7154410
x = 39. a at 0x7ffeb71343e0
x = 38. a at 0x7ffeb71143b0
段错误 (核心已转储)
suiyi@suiyi-virtual-machine:/mnt/hgfs/share/runaway$ ./a.out 38
x = 38. a at 0x7ffe3b85a270
x = 37. a at 0x7ffe3b83a240
x = 36. a at 0x7ffe3b81a210
x = 35. a at 0x7ffe3b7fa1e0
x = 34. a at 0x7ffe3b7da1b0
x = 33. a at 0x7ffe3b7ba180
x = 32. a at 0x7ffe3b79a150
x = 31. a at 0x7ffe3b77a120
x = 30. a at 0x7ffe3b75a0f0
x = 29. a at 0x7ffe3b73a0c0
x = 28. a at 0x7ffe3b71a090
x = 27. a at 0x7ffe3b6fa060
x = 26. a at 0x7ffe3b6da030
x = 25. a at 0x7ffe3b6ba000
x = 24. a at 0x7ffe3b699fd0
x = 23. a at 0x7ffe3b679fa0
x = 22. a at 0x7ffe3b659f70
x = 21. a at 0x7ffe3b639f40
x = 20. a at 0x7ffe3b619f10
x = 19. a at 0x7ffe3b5f9ee0
x = 18. a at 0x7ffe3b5d9eb0
x = 17. a at 0x7ffe3b5b9e80
x = 16. a at 0x7ffe3b599e50
x = 15. a at 0x7ffe3b579e20
x = 14. a at 0x7ffe3b559df0
x = 13. a at 0x7ffe3b539dc0
x = 12. a at 0x7ffe3b519d90
x = 11. a at 0x7ffe3b4f9d60
x = 10. a at 0x7ffe3b4d9d30
x = 9. a at 0x7ffe3b4b9d00
x = 8. a at 0x7ffe3b499cd0
x = 7. a at 0x7ffe3b479ca0
x = 6. a at 0x7ffe3b459c70
x = 5. a at 0x7ffe3b439c40
x = 4. a at 0x7ffe3b419c10
x = 3. a at 0x7ffe3b3f9be0
x = 2. a at 0x7ffe3b3d9bb0
x = 1. a at 0x7ffe3b3b9b80
x = 38. recurse(x) = -38
suiyi@suiyi-virtual-machine:/mnt/hgfs/share/runaway$ ./a.out 6
x = 6. a at 0x7fff7442d560
x = 5. a at 0x7fff7440d530
x = 4. a at 0x7fff743ed500
x = 3. a at 0x7fff743cd4d0
x = 2. a at 0x7fff743ad4a0
x = 1. a at 0x7fff7438d470
x = 6. recurse(x) = -6