首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我可以更改const char*变量的值?

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

Stack Overflow用户
提问于 2009-01-14 03:09:31
回答 4查看 28.1K关注 0票数 30

为什么用C编写的以下代码可以正常工作?

代码语言:javascript
运行
复制
const char* str = NULL;
str = "test";
str = "test2";

既然str是一个指向常量字符的指针,为什么我们可以给它分配不同的字符串文字呢?此外,我们如何保护str不被修改?这似乎是一个问题,例如,如果我们后来将str分配给一个更长的字符串,而这个字符串最终覆盖了内存的另一部分。

我应该补充说,在我的测试中,我在每次赋值之前和之后打印出了str的内存地址,并且它从未改变过。因此,尽管str是指向常量字符的指针,但内存实际上正在被修改。我想知道这是不是C的遗留问题?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-01-13 19:13:08

您正在更改指针,它不是const (它指向的是const)。

如果您希望指针本身为const,则声明应如下所示:

代码语言:javascript
运行
复制
char * const str = "something";

代码语言:javascript
运行
复制
char const * const str = "something";  // a const pointer to const char
const char * const str = "something";  //    same thing

指向非常量数据的常量指针通常比指向常量的指针更不有用。

票数 44
EN

Stack Overflow用户

发布于 2009-01-13 19:12:01

字符串字面量的内存是在堆栈上分配的,您的所有赋值操作都是将str指针更改为指向这些内存地址。它最初指向的常量字符根本没有改变。

票数 1
EN

Stack Overflow用户

发布于 2009-01-13 19:18:07

你要找的可能是语法...

代码语言:javascript
运行
复制
const char* const str = NULL;
str = "test";
str = "test2";

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/440331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档