C 的字串常量

2021-06-26 00:10:38 字數 1157 閱讀 3475

略加思索後,在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 通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域...