為什麼是上圖那樣的結果呢?
這裡有幾個知識點:
1. c語言中的區域性變數儲存在棧裡。所以p1~p6存放情況如下綠色。
2. 棧大家都知道是從棧底往上存東西的,棧的生長方向向上的,這是形象的說法;若從位址大小上來說,這裡棧是從到 高位址鄉低位址的地方生長(可以自己寫程式判斷棧的生長方向)
3,但對於變數個體來說存放順序是向下的,低位址到高位址(這裡又涉及到大小端模式,很明顯這裡是大端模式)
簡單解釋一下:4. %s列印預設是遇到\0結束(符合人平時的書寫順序:比如寫78,位址可以理解為順序,先寫7再寫8,由小序號到大序號,但小序號寫 的是7,7是十位,是高位,也就是高位元組。。。)
小端: 反之
所以現在我們就可以理解p3為什麼是那樣的列印,因為p3沒有結束符,他會順著位址一直列印,知道p2的結束符
p3前面的亂碼是因為,我們賦值的是數字1,2,3,相當於是askll碼了,對應的字元就是那個正方形方框,至於後面的燙燙列印是因為p2的大小15位元組,而賦值的字串長度是11,其餘的是隨機值,編譯器在執行時對這種預設賦值oxcc,對應的字元就是燙
總結:
所謂的亂碼、重疊,覆蓋,均是陣列越界了。如果給陣列拷貝時,不注意大小,沒有結束符\0,就有可能出現亂碼,覆蓋重疊。知道了區域性變數是如何存放的,就是連續放在棧上,如果陣列越界,就是佔了別的變數的位置,那能不發生亂碼,覆蓋嗎?
無論是哪種拷貝函式,都要注意這個這個\0的存在,只不過,memcpy限制了長度,只要輸入的沒錯,不至於導致程式崩潰,但是strcpy就要很注意子符串有無\0,否則很容易越界訪問引起程式崩潰。
1.對於目的陣列,拷貝之前可以都初始化為0,這就相當於給他加了\0
2.還有乙個大前提,目的陣列的長度最好大於等於源陣列長度。
滿足以上兩個條件,就不會越界啦!!!
windows dos視窗 輸出內容重新定位
一般在cmd視窗中執行命令的結果是可以顯示到檔案中的,舉例說明 ping 127.0.0.1 c ping.txt 可以將ping的結果儲存到c ping.txt檔案中。這個檔案你可以任意命名,比如ping.log 123.doc 甚至不要字尾名 c 123,這些檔案內容都是文字資訊,用記事本開啟即...
用XSLT輸出內容
從資料庫得到資訊,用xslt 輸出到web 頁面,保持資料的原樣性,在提取資料時用 xsl value of select x 格式。但是反映到葉面的格仔裡會在內容末尾預設的加乙個空行,我還不知道 pre由什麼屬性可以去掉這一空行,我暫時是這樣解決的,在 td裡加乙個 textarea,不過這樣的話...
用XSLT輸出內容
用xslt輸出內容 從資料庫得到資訊,用xslt 輸出到web 頁面,保持資料的原樣性,在提取資料時用 xsl value of select x 格式。但是反映到葉面的格仔裡會在內容末尾預設的加乙個空行,我還不知道 pre由什麼屬性可以去掉這一空行,我暫時是這樣解決的,在 td裡加乙個 texta...