簡體   English   中英

為什么我可以更改const char *變量的值?

[英]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.

讀取此內容的最簡單方法是從變量名稱開始並向左讀取:

  • str1是一個指向 字符const ant 指針
  • STR2指向一個char const的 ACTER螞蟻
  • STR3是一個const螞蟻指針char const的 ACTER螞蟻

注意:從右到左的讀數在一般情況下不起作用,但對於簡單的聲明,這是一種簡單的方法。 我發現了一個基於“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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM