91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中char[]能修改char*卻不行的示例分析

發布時間:2021-09-13 13:01:27 來源:億速云 閱讀:126 作者:小新 欄目:開發技術

這篇文章給大家分享的是有關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);
}

運行,報錯

C++中char[]能修改char*卻不行的示例分析

錯誤指向了a[8] = ‘d'

C++中char[]能修改char*卻不行的示例分析

錯誤指向第12行,為嘛尼?

看匯編

C++中char[]能修改char*卻不行的示例分析

可以看到變量p,和a 都是采用了同樣的方式

d使用了

mov  esi,offset string "abcefghijkmmmmmmmmmmmmmmmmmmmmmm"...

將字符串的偏移地址,賦值到esi寄存器

a使用了

mov dword ptr [a],offset string "abcefghijkmmmmmmmmmmmmmmmmmmmmmm"...

將字符串的偏移地址,賦值到a變量所在地址

仔細看圖 這兩句對字符串的取址操作,來源都是一個地方,01007500h,也就是程序數據段在內存中的位置

C++中char[]能修改char*卻不行的示例分析

既然兩個操作都是對同一個字符串的操作,為什么有的可以修改,有的不行?

這里面有個關于編譯文件后程序的存儲問題,如上例

變量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*卻不行的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

年辖:市辖区| 武冈市| 得荣县| 铜梁县| 陇川县| 乌苏市| 洛扎县| 浮梁县| 镇沅| 信丰县| 于都县| 观塘区| 广昌县| 酉阳| 平顺县| 南丹县| 佛坪县| 繁昌县| 鹿邑县| 金乡县| 兴文县| 宝坻区| 刚察县| 嘉禾县| 定结县| 利川市| 中牟县| 漳州市| 长治市| 文昌市| 沈阳市| 手机| 吴川市| 东海县| 琼中| 都昌县| 西畴县| 内丘县| 汨罗市| 长武县| 萝北县|