目錄
前兩種是正確的定義方式,第一種之所以沒有指定字元陣列長度的原因是編譯器能夠自己推斷出其長度,無需程式設計師自己設定,這也是我們比較推薦的一種定義方式,但注意記憶體長度編譯器一經判定就無法再次更改,接下來我們分析一下第三種編譯器為什麼會出現亂碼。
相信大家都知道,字串是以'\0'字元為結束標誌的,這個標誌本身也占用乙個記憶體,我們在輸出的時候是看不到這個字元的,這是由編譯器所決定的,因為編譯器的符本身占用了乙個位元組,所以sizeof()這個關鍵字在計算陣列所佔記憶體時要比字元多乙個,如圖中的arr1和arr2,而在計算arr3時,結果只有5,但輸出和圖二中我們所看到的卻不止5個字元,那麼這是為什麼呢?
今天想給大家樹立乙個概念,我們在定義乙個變數時,前面的型別加變數名實際上這是在記憶體中開闢了乙個空間,變數所佔記憶體的大小不是由變數的值所決定的,而時由我們最初開闢的空間的大小所決定的。這是乙個很容易被大家忽視的乙個小小的概念,希望大家能夠牢記這一概念。
int a = 0;//在記憶體中開闢了一段4個位元組的空間,然後將0的二進位制補碼形式(0的補碼是其本身)放入到這段記憶體空間中
char b = 'c';//在記憶體中開闢了一段乙個位元組的空間,然後將字元'c'所對應的ascii碼值所對應的二進位制補碼形式放入到這段記憶體空間中
//至於陣列形式實際和這個是類似的,就是先開闢好陣列所佔的記憶體,然後將所要儲存的資料的二進位制補碼形式放入到記憶體空間中
相信大家對上述原因已經有了屬於自己的一些了解,接下來跟大家談一下為什麼陣列arr3會輸出亂碼,'\0'是字串的結束標誌,但這個結束標誌究竟有什麼用呢?用處有兩點,第一點是swww.cppcns.comtrlen函式在計算字串所佔記憶體空間時,遇到'\0'就會停止,進而能夠求得字串的長度(當然,這個計算不會把'\0'結束標誌計算在內);第二點是編譯器在執行printf函式時,以字串形式進行輸出字元陣列時,遇到'\0'編譯器就會停止輸出,在arr3中,我們開闢的記憶體空間中放滿了字元,沒有字串結束標誌'\0',所以編譯器會在把記憶體空間中的字元輸出完並不會停止,還會繼續進行輸出,直到出teyzfbpd現'\0'www.cppcns.com為止。
sizeof()計算的是變數所佔的記憶體空間的大小,即紅色框內的記憶體大小,也就是我們定義的大小,而strlen()計算的是從變數記憶體起始位置開始,一直向後進行計算,直到遇到結束標誌'\0'為止teyzfbpd,即上圖中紅色的框,下面給大家**展示一下。
相信大家已經有所了解,這也能夠方便我們更好的理解第二種定義方式所遇到的問題。
上述三種定義方式中1和3是正確的程式設計客棧,方式2中並未把結束標誌'\0'放入到陣列最後乙個空間中,這也是我們常犯的乙個錯誤,希望大家要牢記,在採用這種方式對字串進行定義時,不要忘記加上字串的結束標誌'\0',因為編譯器不會為程式設計師自動新增'\0',所以我們並不推薦這種方式來對字串進行定義,除了加上'\0'之外,另一種方式就是限定字串長度,限定之後編譯器會在末尾加上結束標誌'\0'(此處只是指的vs2019編譯器,其它編譯器筆者並未驗證),當然,最推薦的還是程式設計師手動新增'\0'作為結束標誌。
本文標題: c語言中字串的兩種定義方式詳解
本文位址:
C語言的兩種字串
c語言中的兩種字串 1.兩種字串的表示 1.字串陣列 char str1 hello char str2 6 hello 注意 在字串 陣列 初始化時sizeof str 的大小應該比你想要的大小 1,因為在作為字串時,會有乙個 0 自動成為字串的元素 上述的例子如果變成 char str2 5 h...
C語言中儲存多個字串的兩種方式
宣告 char name 4 10 在記憶體中的儲存 ju stin ian 0 momo 0 0 0 0 0 0be cky 0 0 0 0 0bu sh 0 0 0 0 0 0 這種方式會造成記憶體空間的浪費 宣告 char name 4 在記憶體中的儲存 name 0 ju stin ian ...
C語言中定義字串的幾種方式
所謂字串本質上就是以 0作為 結尾的特殊字元陣列 由於字串本質上其實就是以 0作為 結尾的特殊字元陣列,所以定義字串時,必須保證字串儲存的最後乙個元素為 0 當我們沒有給定字串具體長度時,我們通過這種方式 char 字串名稱 來定義字串時,就需要手 動的在字串末尾加上 0 不然的話,它就僅僅是乙個字...