略加思索後,在vc6.0上寫出了如下**:
#include
char *reverse_str(char *str);
void main()
char *reverse_str(char *str)
return str; }
結果在debug的時候遇到0xc0000005:access violation的錯誤。
這裡涉及到對c++字串常量的理解。
1.區域性變數儲存在棧中;
2.全域性變數、靜態變數儲存在靜態儲存區;
3.new申請的記憶體是在堆中;
4.字串常量也是儲存在靜態儲存區。
注意:棧中的變數記憶體會隨著定義所在區間的結束自動釋放,而對於堆,需要手動free。對於靜態儲存區,其中的變數常量在程式執行期間會一直存在,不會釋放,且只有乙份拷貝。
char *s = "abcd";定義的是字串常量,儲存在靜態儲存區。不能通過指針對其進行修改。
其實,通常的寫法是const char *s = "abcd";
如果要修改字串內容,則應按如下方式定義字串變數:
char s[5] = "abcd";
注意,字元陣列長度要比可見字元數多1,因為編譯器會新增字元'\0'作為字串結束標識。
所以,下面這段測試**:
char *str1 = "ads";
char *str2 = "ads";
char *str3 = "ads";
char str4[4] = "ads";
char str5[4] = "ads";
if(str1==str2)
cout<<"str1==str2"< cout<<"str2==str3"< cout<<"str3!=str4"< cout<<"str4!=str5"《輸出結果為:
str1==str2
str2==str3
str3!=str4
str4!=str5
再回到開始那段**,做如下修改,就可以成功執行了。
#include
char *reverse_str(char *str);
void main()
char *reverse_str(char *str)
return str;
}
常量,字串常量
對於普通變數常量 常量摺疊 是 就是在編譯器進行語法分析的時候,將常量表示式計算求值,並用求 得的值來替換表示式,放入常量表。可以算作一種編譯優化 include void main 輸出 3 2 我只是改了這個位址內容,但是e還是2,因為編譯器在優化的過程中,會把碰見的const全部以內容替換掉 ...
C語言的字元陣列,字串,字串常量
首先來看一段源 include int main 剩餘部分為 0 char brr 不是字串,因為沒有 0 char crr 10 字元陣列特有 char drr 10 abc 字元陣列特有 char err abc 字元陣列特有 char frr 10 printf s n arr printf ...
C語言常量字串
關於c語言字串常量不可修改,起初誤認為是編譯器 把這樣的 char s str 優化成了 const char str const屬性也去不了。但是實際上是與常量字串的記憶體體現有關。bodata段 bss段 bss段 bsssegment 通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域...