常量字符串例如“abcde”這種的系統會將他們放在常量區,而常量區就是意味着不能修改的,只可以讀取的數據區域,並且相同常量字符串只有一份。
void string2()
{
char* p = "abcde";
printf("%p\n", p);
char*p1 = "abcde";
printf("%p\n", p1);
}
如上,p1和p的地址是一樣的,他們都指向的是同一個常量向量,這是編譯器做的優化。
char *string1()
{
char str[20] = "abcde";
return str;
}
char* string2()
{
char* p = "abcde";
return p;
}
void main()
{
char * p = string1();
printf("%s\n", p);
char *pp = string2();
printf("%s", pp);
system("pause");
}
上面定義了一個字符數組char str[20] = "abcde";等於字符常量,還定義了一個char* p = "abcde";指針指向字符常量,同時返回他們的首地址,結果卻是指針可以正確輸出而數組卻不可以,這是爲什麼呢?存的都是常量字符串。這是因爲char str[20],系統給它分配了二十個字節連續的地址,然後把這篇內存的首地給受託人,最後用abcde去初始化數組,地址已經存在,內存也已經存在,所以系統會把用來初始化的常量字符串從常量區複製一份然後放入數組的內存區域中。所以數組str的內存區域hi在棧區,而棧區就是用完就會回收,所以函數結束內存被回收了從而導致了錯誤的結果。同時這也意味着char str[20] = "abcde”中的值是可以修改的str[1]=“t”是可以的。但是指針就是直接指向了常量區,不可以對指針指向的字符串進行修改,p[0]=“r”這種操作是不允許的,常量區是不可以修改的。