char *c1 = "abc";實(shí)際上先是在文字常量區(qū)分配了一塊內(nèi)存放"abc",然后在棧上分配一地址給c1并指向這塊地址,然后改變常量"abc"自然會(huì)崩潰。然而char c2[] = "abc",實(shí)際上abc分配內(nèi)存的地方和上者并不一樣,可以從4199056 2293624 看出,完全是兩塊地方,推斷4199056處于常量區(qū),而2293624處于棧區(qū)。2293628 2293624 2293620 這段輸出看出三個(gè)指針分配的區(qū)域?yàn)闂^(qū),而且是從高地址到低地址,2293620 4199056 abc 看出編譯器將c3優(yōu)化指向常量區(qū)的"abc"。
繼續(xù)思考:
代碼:
include <iostream>
using namespace std;
main()
{ char *c1 = "abc";
char c2[] = "abc";
char *c3 = ( char* )malloc(3);
// *c3 = "abc" //error
strcpy(c3,"abc");
c3[0] = 'g';
printf("%d %d %s\n",&c1,c1,c1);
printf("%d %d %s\n",&c2,c2,c2);
printf("%d %d %s\n",&c3,c3,c3);
getchar(); }
輸出:
2293628 4199056 abc
2293624 2293624 abc
2293620 4012976 gbc
寫成注釋那樣,后面改動(dòng)就會(huì)崩潰
可見strcpy(c3,"abc");abc是另一塊地方分配的,而且可以改變,和上面的參考文檔說法有些不一定,而且我不能斷定4012976是哪個(gè)區(qū)的,可能要通過算區(qū)的長(zhǎng)度。
相關(guān)推薦:C++等考輔導(dǎo):C++static關(guān)鍵字使用時(shí)的技巧北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |