为什么我可以更改const char *变量的值?

为什么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 acter的指针
  • str3是一个指向 char acter const ant的const ant 指针

注意:从右到左的读数在一般情况下不起作用,但对于简单的声明,它是一种简单的方法。 我找到了一个基于“C编程语言”代码的java applet ,它可以解释声明,并详细说明如何操作。

在相关的说明中,一定要看一下“ const指针与指向const的指针 ”。 它有助于一些人称为const正确性 。 我把它保存在我的书签中,这样我就可以不时地参考它。

您正在寻找的可能是语法……

 const char* const str = NULL; str = "test"; str = "test2"; 

注意char *之后的“const”,它在尝试编译/构建时产生编译器错误。

字符串文字的内存在堆栈上分配,所有的分配都是将str指针更改为指向那些内存地址。 它最初指出的常数字符根本没有改变。

此外,将变量声明为const意味着变量是只读的; 这并不意味着价值是恒定的!