您好,登錄后才能下訂單哦!
C語言的一個知識點:
char *str1 = "hello world" 和 char str2[] = "hello world"; 的區別:
1、內存管理:
內存分為了:只讀代碼段,只讀數據段,BSS,堆,棧五個不同區域。
如上圖所示: 只讀代碼段一般存放的是編寫好的程序。
只讀數據段放的是常量(字符串常量,數組名稱,函數名稱),只讀區域不能更改!
BSS區域存放的是全局變量和static靜態類變量,又分為未初始化,值都為0,和已初始化區域。
堆中存放的是malloc(),calloc()……申請的空間,不由操作系統回收,必須靠程序員自己通過free()回收空間,不然就是內存泄漏!!!
棧中存放的是局部變量,形參變量,棧中空間可被任何函數使用,是數據的可靠性很低!
2、str1是指針變量,str1++; right,指針加減整型,結果還是指針。
對于str2而言,char str2[] = "hello world"; <=> char str2[] = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '\0'};
這是對字符數組初始化,所以str2是數組名稱(指針常量),str2++;false,常量不能賦值!
"hello world"字符串本身就是以0結尾的字符數組!!!
3、"hello world"字符串常量在只讀數據段,值本身內容不能被更改!!!
str1為指針變量,*str1 = 't'; false,更改的是只讀數據段中的區域。
str2為數組名稱,其空間在棧中申請,*str2 = 't'; true,棧中的數據可以被更改。
4、對char *str1 = "hello world"的深刻理解
strlen(str1); 11
strlen(str2); 11
sizeof(str2); 12 數組名稱,求字節數,是數組所申請的空間的字節數,在上0結束標志。
sizeof(str1); 4/8 與平臺有關,32位系統下,指針4字節,64位,指針8字節
sizeof(*str1); 1 *str1 就是'h',占用一個字節。
sizeof("hello world"); 12 字符串常量所占空間
strlen();函數,求得是字符串長度,不算那個0;sizeof();關鍵字,單目運算符,求字節數,算字符串的結束標志0。
5、[]中的值,由初值個數決定。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。