1、關(guān)于字符串的使用:
? (1)char str[n] 即棧區(qū)分配 n 個(gè)字節(jié)的的空間,但是在使用的過程中,會(huì)出現(xiàn)超出分配的空間,例如:使用 strcpy 函數(shù)將一個(gè)字符串長度大于 n 的字符串拷貝在數(shù)組 str 中,超過 n 個(gè)字節(jié)的部分會(huì)順序存儲(chǔ)在 str+n 的地址后面,即被拷貝的字符串到了新的地址空間 str 仍舊滿足物理上的順序結(jié)構(gòu);??
char array[10] = "ab";
char str[] = "i love my country";
my_strcpy(array,str);
printf("%s\n", array);
在調(diào)試上述代碼時(shí),可以順利運(yùn)行 my_strcpy ,但是運(yùn)行到結(jié)尾處 ‘ } ’ 時(shí)會(huì)報(bào)錯(cuò)?:
運(yùn)行時(shí)檢查失敗#2-在變量‘?dāng)?shù)組’周圍的堆棧被破壞.
在調(diào)試過程中,也是發(fā)現(xiàn)定義一個(gè)大小為 10 的數(shù)組,在沒有數(shù)據(jù)的位置都是以 ' \0 ' 的形式存在的,而沒有分配的地址空間是以 -52'?' 的形式存在,可見是不合法的;但是在 my_strcpy 的過程中 str 訪問到了沒有被分配的地址空間,編譯器也沒有報(bào)錯(cuò),仍舊繼續(xù)進(jìn)行訪問;
聯(lián)系與反思:
使用 malloc 在堆區(qū)申請一塊空間,返回空間的首地址,申請的地址是一塊物理連續(xù)的地址空間,那么既然申請的是一塊連續(xù)的地址空間,是否也可以越界訪問并擁有可寫權(quán)限;
int* space = (int*)malloc(sizeof(int)*10);
for (int i = 0; i< 15; i++) {
*(space + i) = i;
}
在上述代碼中我們可以看到 malloc 申請了一塊大小為 sizeof (int)*10 的地址空間,在調(diào)試窗口中可以看到這一塊空間存儲(chǔ)的都是 0 或者隨機(jī)數(shù),當(dāng)我們在 for 循環(huán)的中訪問到第十一個(gè) int 空間時(shí),代碼沒有報(bào)錯(cuò),繼續(xù)訪問,也有可寫權(quán)限;
從可以知道定義數(shù)組可知,編譯器會(huì)在代碼結(jié)尾處報(bào)錯(cuò)——變量‘?dāng)?shù)組’周圍的堆棧被破壞,但是在非?malloc 申請的地址空間下操作,編譯器未報(bào)錯(cuò);
在后續(xù)的操作中——獲取未申請的且被修改的空間的地址,用指針指向這一塊地址,依舊是可以進(jìn)行操作;
(2)關(guān)于 char *str 、char str [num] 和char str[ ] 三種字符串的定義方式;
char str [num] 是在棧區(qū)分配的空間,棧區(qū)空間是由系統(tǒng)分配與釋放;隨著函數(shù)結(jié)束,系統(tǒng)自己會(huì)清除;
char str[ ] 是將存放在靜態(tài)存儲(chǔ)區(qū)即常量區(qū)中的常量拷貝在數(shù)組 str 中;即在堆區(qū)申請一塊空間進(jìn)行存儲(chǔ)拷貝過來的常量,也就是說此時(shí) str 也就和上述的str[num] 是等價(jià)的;
char *str 是將指針 str 指向常量區(qū)的常量地址,而靜態(tài)存儲(chǔ)區(qū)是不可修改的,只有可讀權(quán)限,并沒有修改權(quán)限,故而 char *str 可以打印出來,而不能修改其中的值;
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧