您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關C++中char[]能修改char*卻不行的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
代碼
int main(int argc, char *argv[]) { char p[74] = "abcefghijkmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm"; char *a = "abcefghijkmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm"; printf("%s,%s",p,a); }
這誰都能看明白,最終輸出兩次abcefghijkmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm,沒問題
把代碼再改改
int main(int argc, char *argv[]) { char p[74] = "abcefghijkmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm"; char *a = "abcefghijkmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm"; p[8]= 'd'; a[8] = 'd'; //printf("%s,%s",p,a); }
運行,報錯
錯誤指向了a[8] = ‘d'
錯誤指向第12行,為嘛尼?
看匯編
可以看到變量p,和a 都是采用了同樣的方式
d使用了
mov esi,offset string "abcefghijkmmmmmmmmmmmmmmmmmmmmmm"...
將字符串的偏移地址,賦值到esi寄存器
a使用了
mov dword ptr [a],offset string "abcefghijkmmmmmmmmmmmmmmmmmmmmmm"...
將字符串的偏移地址,賦值到a變量所在地址
仔細看圖 這兩句對字符串的取址操作,來源都是一個地方,01007500h,也就是程序數據段在內存中的位置
既然兩個操作都是對同一個字符串的操作,為什么有的可以修改,有的不行?
這里面有個關于編譯文件后程序的存儲問題,如上例
變量a,p他們都是操作相同的字符串,兩個字符串完全相同,所以,程序編譯后,生成的文件內,完全沒有必要保存兩個相同的內容,只保留一個便可以,所以,你的程序,不管多少次使用這個字符串,實際上都是從一個地方引用的,這就是,這兩句代碼
mov esi,offset string "abcefghijkmmmmmmmmmmmmmmmmmmmmmm"... mov dword ptr [a],offset string "abcefghijkmmmmmmmmmmmmmmmmmmmmmm"...
的意思。
但這就出現了一個問題,如果兩個或者多個變量都用了同一個字符串,然后最終要的,還進行了修改,結果就是,所有引用這個字符串的變量,都變了,所以
a[8] = 'd';
要直接修改數據段,就報錯了
但是p可以,為什么,應為數組的處理是不一樣的,看代碼
mov esi,offset string "abcefghijkmmmmmmmmmmmmmmmmmmmmmm"... (0977588h) lea edi,[p] rep movs dword ptr es:[edi],dword ptr [esi]
首先,把字符串的地址給了esi,然后把p地址給了edi,
然后,通過rep movs 循環執行,吧[esi]處的字符,賦值給[edi],也就是把字符串復制一份到p
所以,你操作的
p[8] ='d';
實事上是操作了一個新的字符串,不是數據段中的那個字符串,
再看關于a的操作
mov dword ptr [a],offset string "abcefghijkmmmmmmmmmmmmmmmmmmmmmm"... mov eax,1 shl eax,3 mov ecx,dword ptr [a] mov byte ptr [ecx+eax],64h
首先把1給了eax,然后執行位移3,把EAX,變成8,把a的地址,也就是字符串的地址給了ecx,然后吧64h也就是d,賦值給[ecx+eax] 那個位置,也就是j的位置,因而你操作的是數據段中的那個字符串,就是上面的原因,系統會阻止你修改數據段,因而報錯
感謝各位的閱讀!關于“C++中char[]能修改char*卻不行的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。