- 爲什麼存儲在讀寫區域字符串時,它是用const修飾聲明?
這是所有文字常量都去的地方。這樣他們可以在流程之間共享,也可以在其他指針之間共享。
- 爲什麼「hello world」存儲在讀寫區域時,字符串應該是不可變的?
指針(到文字常量)本身是可變。 「hello world」很可能存儲在全局常量中。
- 有沒有一種方法可以確定(在代碼本身中)變量存儲在哪個段和區域(C99)?
全局和靜態變爲'全局變量',局部變量和參數變爲'棧',malloc
'變成'堆'。至於全局變量,那些是const的可能會也可能不會去'全局常量'。
- 爲什麼BSS /初始化數據段中的只讀和讀寫區域之間沒有分離?
有通常兩個段 - 一個用於常量數據(以及一個進程之間共享),一個用於可變數據(其不能被明顯地共享)。
- 如果const修飾符被關閉,上面的引用語句仍然是真的嗎?如果不是,爲什麼不呢?
在C++中,所有字符串文字都是const char*
,而在C中它們本質上是char*
。因此,在C中的變量(除了有時會出現警告)之外添加/刪除const變量沒有問題,但它會在C++中導致const-cast錯誤。在const char* string
中有const
禁止string
的數據被修改。
P.S.下面的代碼可以幫助你瞭解正在發生的事情:
int main()
{
char s1[] = "abc";
char* s2 = "abc";
const char* s3 = "abc";
s1[0] = 'z';
s2[0] = 'x';
// s3[0] = 'y'; will not compile due to const
printf("%s %s %s\n", s1, s2, s3);
s2++; s3++; // it perfectly fine to modify pointers themselves
}
根據平臺,代碼可能在S2崩潰(Linux)的[0]賦值,或可能成功;在後面的情況下,s3也可能會被修改(Cygwin)或者可能不會。
所以,即使你離開了const,「abc」仍然是不可變的 - 那麼添加const的意義是什麼?謝謝 –
@WuschelbeutelKartoffelhuhn:它基本上是一個錯誤,但由於歷史的慣性,C允許您爲字符串文本指定一個指向'char *'的指針。考慮它歷史古怪。對於它的價值,C++ 11修復了這個問題。字符串文字總是隻讀的,就是這樣。 –