![](/img/trans.png)
[英]Why can't I convert 'char**' to a 'const char* const*' in C?
[英]Why can I change the value of a const char* variable?
為什么C中的以下代碼有效?
const char* str = NULL;
str = "test";
str = "test2";
由於str是指向常量字符的指針,為什么我們允許為它分配不同的字符串文字? 此外,我們如何保護str不被修改? 看起來這可能是一個問題,例如,我們后來將str分配給一個更長的字符串,最后寫入另一部分內存。
我應該補充一點,在我的測試中,我在每個作業之前和之后打印出str的內存地址,但它從未改變過。 因此,盡管str是指向const char的指針,但內存實際上正在被修改。 我想知道這可能是C的遺留問題嗎?
你正在改變指針,它不是const(它指向的東西是const)。
如果您希望指針本身為const,則聲明將如下所示:
char * const str = "something";
要么
char const * const str = "something"; // a const pointer to const char
const char * const str = "something"; // same thing
指向非const數據的const指針通常是一個不如指針到const的有用構造。
此外,我們如何保護str不被修改?
char * const str1; // str1 cannot be modified, but the character pointed to can
const char * str2; // str1 can be modified, but the character pointed to cannot
const char * const str3 // neither str3 nor the character pointed to can be modified.
讀取此內容的最簡單方法是從變量名稱開始並向左讀取:
注意:從右到左的讀數在一般情況下不起作用,但對於簡單的聲明,這是一種簡單的方法。 我發現了一個基於“C編程語言”代碼的java applet ,它可以解釋聲明,並詳細說明如何進行。
在相關的說明中,一定要看看“ const指針與指向const的指針 ”。 它有助於一些人稱為const正確性 。 我把它保存在我的書簽中,這樣我就可以不時地參考它。
字符串文字的內存在堆棧上分配,所有的分配都將str
指針更改為指向那些內存地址。 它最初指向的常數字符根本沒有改變。
您正在尋找的可能是語法......
const char* const str = NULL;
str = "test";
str = "test2";
注意char *之后的“const”,它在嘗試編譯/構建時產生編譯器錯誤。
此外,將變量聲明為const意味着變量是只讀的; 這並不意味着價值是恆定的!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.