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

时间:2009-01-13 19:09:31

标签: c pointers const

为什么C中的以下代码有效?

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

由于str是指向常量字符的指针,为什么我们允许为它分配不同的字符串文字?此外,我们如何保护str不被修改?例如,如果我们后来将str分配给一个更长的字符串,最后写入另一部分内存,那么这似乎是一个问题。

我应该补充一点,在我的测试中,我在每个作业之前和之后打印出str的内存地址,但它从未改变过。因此,尽管str是指向const char的指针,但内存实际上正在被修改。我想知道这可能是C的遗留问题吗?

6 个答案:

答案 0 :(得分:35)

你正在改变指针,它不是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的有用构造。

答案 1 :(得分:13)

  

此外,我们如何保护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 蚂蚁指针 char acter
  • str2 指针指向 char acter const ant
  • str3 是一个 const 蚂蚁指针 char acter const ant

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

答案 2 :(得分:2)

相关说明,请务必查看“const pointer versus pointer to const”。它有助于一些人称之为 const正确性。我把它保存在我的书签中,这样我就可以不时地参考它。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:1)

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