使用char型陣列過程中遇到的問題

2021-07-23 16:28:25 字數 1989 閱讀 1601

最近開發中用到了char陣列來接收資料 , 在使用中遇到了一些問題,這裡記錄一下,同時也回顧一下char陣列的用法。

char aa[0];
首先,我們要知道,0長度的陣列在iso c和c++的規格說明書中是不允許的,用vs2013編譯報錯:「不能分配常量大小為 0 的陣列」。

char aa[4] = "1234";
這樣我們定義乙個長度為4的陣列,直接賦值「1234」,這裡會提示陣列界限溢位,看上圖中提示,「1234」實際上類似char bb[5] = 「1234」; 說明「1234」後面還有乙個字元結束符』\0』的存在,所以佔了5個字元。

那麼char陣列最後一位必須是』\0』嗎?不一定,『\0』只是字串的結束標記,並沒有規定char陣列的最後一位必須是』\0』,那為什麼這裡將「1234」賦值給aa[4] 這個陣列不行呢,』1』、』2』、』3』、』4』剛好4個字元分別分配給aa[0]、aa[1]、aa[2]、aa[3],這樣的確可以,下面會給出例子確實可以這樣分配,但是這裡的 「1234」如上所述是類似於乙個char bb[5] 的陣列,你能把乙個長度為5的陣列強行賦值給乙個長度為4的陣列嗎?,,,顯然不可以,所以這裡會提示錯誤。

仔細看上箭頭標註的地方,為什麼aa陣列顯示為「1234…」,而bb陣列顯示為「1234」,再看看看紅色矩形框中的資料。

先看aa陣列,箭頭所指位置顯示為「1234…」這裡為什麼在1234後面顯示省略號呢,原因就是aa陣列後面沒有字元結束符』\0』,這裡的』…』其實就是aa陣列後面的資料,其實將aa和bb陣列輸出就知道發生了什麼。

輸出:

12341234

1234

aa length : 8

好了,我們也看到結果了,輸出aa陣列時將bb陣列的值也一起輸出了,這是為什麼呢?

看一下aa陣列和bb陣列的位址aa:efd28 與 bb:efd2c ,相差4位,而bb陣列的資料在aa陣列之後,在輸出時因為aa陣列沒有字元結束符,而bb陣列最後一位為』\0』 ,所以輸出aa時一直到bb陣列的最後一位』\0』結束。同時我們也看到aa陣列的長度為8,正如輸出字元的長度。

而這裡我們確實看到』1』、』2』、』3』、』4』 這4個字元分別分配給了 aa[0]、aa[1]、aa[2]、aa[3] ,這裡通過memcpy方法能夠將bb陣列中前4個位元組的內容拷貝到aa陣列中 , 所以通過記憶體拷貝的方法是可以的,但是直接給aa陣列賦值 「1234」在本質上就是不對的。

再看到bb陣列,箭頭部分顯示為「1234」是正確的,矩形方框內末尾一位為』\0』,所以輸出bb陣列是沒有問題的。

那麼aa陣列的起始位址和bb陣列的起始位址是怎麼定的呢 ,難道是哪個陣列先定義哪個位址就在前嗎?

我們看到儘管aa陣列定義在了bb陣列後面,但是aa陣列的位址仍在bb陣列前面,關於記憶體位址如何分配我們下期給予論述。

使用jquery過程中遇到的坑

最近在使用jquery過程中發現了幾個小問題,不知道有沒有其他人遇到。問題一 假的dom結構,比如input的乙個選中狀態,用jquery中的attr 進行新增和刪除,在google除錯中看到是正常的,但是傳給後台的值是不對的。我找了很久才發現原因,我的dom結構是假的。只是表面上看起來好像刪除掉了...

使用ArchLinux中過程中遇到的問題

可以到這裡 看本文,效果要好一些 前段時間裝了archlinux,使用了一段時間的kde,不過最終還是換回了gnome。唉!沒堅持住。archlinux安裝gnome直接就裝的gnome3 arch還真是超前 不過,gnome3確實很漂亮!1.在gnome3下使用fcitx 首先確定你安裝了中文字型...

使用wordpress搭建部落格過程中遇到的一些問題

對於乙個新手而言,第一次使用wordpress搭建個人部落格,而且要在不同的環境上work,包括mac,ubuntu。再搭建的過程中遇到了很多的問題,通過一步步除錯,逐步定位 問題所。比如wordpress在上傳的時候會自動生成縮圖,這個在mac上工作的很好,但是移植到ubuntu上的時候,縮圖生成...