陣列用 s輸出,內容重疊,覆蓋,亂碼問題

2021-08-27 14:05:06 字數 1272 閱讀 4559

為什麼是上圖那樣的結果呢?

這裡有幾個知識點:

1.  c語言中的區域性變數儲存在棧裡。所以p1~p6存放情況如下綠色。

2.  棧大家都知道是從棧底往上存東西的,棧的生長方向向上的,這是形象的說法;若從位址大小上來說,這裡棧是從到                     高位址鄉低位址的地方生長(可以自己寫程式判斷棧的生長方向)

3,但對於變數個體來說存放順序是向下的,低位址到高位址(這裡又涉及到大小端模式,很明顯這裡是大端模式)

簡單解釋一下:

(符合人平時的書寫順序:比如寫78,位址可以理解為順序,先寫7再寫8,由小序號到大序號,但小序號寫                                  的是7,7是十位,是高位,也就是高位元組。。。)  

小端:   反之           

4. %s列印預設是遇到\0結束

所以現在我們就可以理解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...