1、關于字符串的使用:
? (1)char str[n] 即棧區(qū)分配 n 個字節(jié)的的空間,但是在使用的過程中,會出現(xiàn)超出分配的空間,例如:使用 strcpy 函數(shù)將一個字符串長度大于 n 的字符串拷貝在數(shù)組 str 中,超過 n 個字節(jié)的部分會順序存儲在 str+n 的地址后面,即被拷貝的字符串到了新的地址空間 str 仍舊滿足物理上的順序結構;??
char array[10] = "ab";
char str[] = "i love my country";
my_strcpy(array,str);
printf("%s\n", array);
在調(diào)試上述代碼時,可以順利運行 my_strcpy ,但是運行到結尾處 ‘ } ’ 時會報錯?:
運行時檢查失敗#2-在變量‘數(shù)組’周圍的堆棧被破壞.
在調(diào)試過程中,也是發(fā)現(xiàn)定義一個大小為 10 的數(shù)組,在沒有數(shù)據(jù)的位置都是以 ' \0 ' 的形式存在的,而沒有分配的地址空間是以 -52'?' 的形式存在,可見是不合法的;但是在 my_strcpy 的過程中 str 訪問到了沒有被分配的地址空間,編譯器也沒有報錯,仍舊繼續(xù)進行訪問;
聯(lián)系與反思:
使用 malloc 在堆區(qū)申請一塊空間,返回空間的首地址,申請的地址是一塊物理連續(xù)的地址空間,那么既然申請的是一塊連續(xù)的地址空間,是否也可以越界訪問并擁有可寫權限;
int* space = (int*)malloc(sizeof(int)*10);
for (int i = 0; i< 15; i++) {
*(space + i) = i;
}
在上述代碼中我們可以看到 malloc 申請了一塊大小為 sizeof (int)*10 的地址空間,在調(diào)試窗口中可以看到這一塊空間存儲的都是 0 或者隨機數(shù),當我們在 for 循環(huán)的中訪問到第十一個 int 空間時,代碼沒有報錯,繼續(xù)訪問,也有可寫權限;
從可以知道定義數(shù)組可知,編譯器會在代碼結尾處報錯——變量‘數(shù)組’周圍的堆棧被破壞,但是在非?malloc 申請的地址空間下操作,編譯器未報錯;
在后續(xù)的操作中——獲取未申請的且被修改的空間的地址,用指針指向這一塊地址,依舊是可以進行操作;
(2)關于 char *str 、char str [num] 和char str[ ] 三種字符串的定義方式;
char str [num] 是在棧區(qū)分配的空間,棧區(qū)空間是由系統(tǒng)分配與釋放;隨著函數(shù)結束,系統(tǒng)自己會清除;
char str[ ] 是將存放在靜態(tài)存儲區(qū)即常量區(qū)中的常量拷貝在數(shù)組 str 中;即在堆區(qū)申請一塊空間進行存儲拷貝過來的常量,也就是說此時 str 也就和上述的str[num] 是等價的;
char *str 是將指針 str 指向常量區(qū)的常量地址,而靜態(tài)存儲區(qū)是不可修改的,只有可讀權限,并沒有修改權限,故而 char *str 可以打印出來,而不能修改其中的值;
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
本文名稱:C語言——字符串的使用-創(chuàng)新互聯(lián)
當前地址:http://bm7419.com/article24/ddhsce.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、響應式網(wǎng)站、定制網(wǎng)站、用戶體驗、網(wǎng)站設計、自適應網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)