日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

你很烫吗?我很烫——关于栈区和静态存储区的思考

發布時間:2025/3/15 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 你很烫吗?我很烫——关于栈区和静态存储区的思考 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.引言

相信經常用VC的朋友對屏幕輸出的一大堆“燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙”不會陌生,但是也許會很奇怪,為什么會出現“燙”字呢?莫非改程序導致系統運行緩慢,發熱過高???非也!下面解釋一下,有錯誤的地方請指正:

如果逆向Debug模式下一個C程序,發現棧區開辟的存儲空間都是使用0CCCCCCCCh來填充4字節單位的,也就是說,棧區開辟的存取局部變量的空間的每一個字節都被0xCC填充了(為什么用0xCC,這個是int 3h的機器碼,下斷點用的)兩個0xCC合起來輸出時恰好對應中文“燙”字

這也就不奇怪程序輸出那么多“燙”了。

2.實例演示

實例一:

#include "stdafx.h" #include <string.h>int _tmain(int argc, _TCHAR* argv[]) {char s[256] = {0}; // 定義一個數組memset(s, 0xCC, sizeof(s)); // 用0xCC填充printf("%s\n", s); // 輸出return 1; }

查看運行結果:

程序輸出結果


實例二:

#include "stdafx.h" #include <string.h>int _tmain(int argc, _TCHAR* argv[]) {char s[256]; // 系統默認用0xCC填充printf("%s\n", s); // 輸出return 1; } 程序輸出還是”很燙“。


實例三:把字符數組定義為全局變量

#include "stdafx.h" #include <string.h>char s[256]; // 全局變量int _tmain(int argc, _TCHAR* argv[]) {printf("%s\n", s); // 輸出return 1; }

這次系統輸出了空,沒有燙了!為什么???
其實,全局變量分配在”全局/靜態存儲區“中,局部變量分配在棧中,我們可以定義一個很大的數組,如果是局部的,會導致程序棧溢出,因為棧的空間大小是有限制的;而全局的則不會。
另外需要注意,這些”燙燙燙燙燙燙燙“現象只會在Debug模式中出現,在Release模式中不會出現。

如果你對”燙燙燙燙燙燙燙“表示很熟悉,那么”屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯“你見過嗎?應該吧。我本人以前經常遇到”燙“,但很少遇到后者。


實例四:動態分配內存空間

#include "stdafx.h" #include <stdio.h> #include <stdlib.h>int main(int argc, char* argv[]) {char *s = (char *)malloc(sizeof(char) * 256);puts(s);free(s);return 0; }

運行程序,頓時滿屏的”屯“字出現在眼前,有圖有真相:

程序輸出結果

因為,動態分配的空間開辟于堆,VC的Debug用0xCD填充堆的空間,兩個0xCD和在一起就是屯了。 與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的你很烫吗?我很烫——关于栈区和静态存储区的思考的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。