關(guān)于const_cast
const char str[] = "abc";
char * s = const_cast<char *>(str);
s[0] = 'A';
cout<<s<<endl; //輸出Abc
但是這樣就不行了:
const char *str = "abc";
char * s = const_cast<char *>(str);
s[0] = 'A';
cout<<s<<endl; //編譯能通過(guò),但是執(zhí)行就報(bào)錯(cuò)。
: const char str[] = "abc"; abc存儲(chǔ)在堆棧中;
: const char *str = "abc"; abc存儲(chǔ)在靜態(tài)存儲(chǔ)區(qū);
準(zhǔn)確的說(shuō),上面兩個(gè)“abc"都是存儲(chǔ)在靜態(tài)存儲(chǔ)區(qū),即常量區(qū)。常量區(qū)是可讀不可寫(xiě)的。所以任何試圖對(duì)常量區(qū)進(jìn)行寫(xiě)的操作都是非法的,當(dāng)然了,這也不是一定不可寫(xiě)的,你可以采取某種渠道改變常量區(qū)的內(nèi)存屬性,比如改變pe相關(guān)節(jié)的屬性就可以對(duì)常量區(qū)進(jìn)行讀寫(xiě),當(dāng)然了,這個(gè)目前可以忽略。。。
那么為什么str[] = "abc"; 可以寫(xiě)呢?答案就在str[] = "abc";會(huì)有一個(gè)額外的拷貝過(guò)程,即把常量區(qū)的 "abc"拷貝到棧內(nèi)存去,所以就可以寫(xiě)了。