将常量char*设置为char[]文本是否安全? 我在一些C++代码中发现了: const char *scaryPointer = "literal";

将常量char*设置为char[]文本是否安全? 我在一些C++代码中发现了: const char *scaryPointer = "literal";,c++,string,C++,String,令我惊讶的是,这不会生成编译器警告或错误(至少在VisualStudio2008中是这样) 这样做真的安全吗?我认为在该行完成执行后,char[]文本的地址将无效 如果安全的话,如果您将scaryPointer重新指定给一个新的文本,会发生什么?旧文本的地址会自动释放吗?自动垃圾收集 我发现了,但是(我认为)这些问题/答案并没有完全解决我的问题和顾虑。字符串文字具有静态存储持续时间,因此只要程序运行,它们就会一直存在。它们通常存储在程序启动时加载的只读程序映像中。字符串文字具有静态存储持续时间,

令我惊讶的是,这不会生成编译器警告或错误(至少在VisualStudio2008中是这样)

这样做真的安全吗?我认为在该行完成执行后,char[]文本的地址将无效

如果安全的话,如果您将
scaryPointer
重新指定给一个新的文本,会发生什么?旧文本的地址会自动释放吗?自动垃圾收集


我发现了,但是(我认为)这些问题/答案并没有完全解决我的问题和顾虑。

字符串文字具有静态存储持续时间,因此只要程序运行,它们就会一直存在。它们通常存储在程序启动时加载的只读程序映像中。

字符串文字具有静态存储持续时间,因此它们在整个程序执行期间都存在。

const char*notScaryPointer=“literal”
是完全有效的C。它是指向只读内存中的
char
的指针。您可以稍后像
notScaryPointer=“some\u other\u literal”那样重新分配它。但由于
constchar*
s分配给只读内存中的字符串文本,因此无法更改它们。例如此代码段可能会给您一个运行时错误:
const char*strPointer=“你好,世界!”;
strPointer[0]=“Y”

如果您想要可变字符串,那么指向
char
s的指针将不起作用。如果这是您想要的,那么使用
char
s的数组


编辑:我一开始没有注意到您的问题,但正如其他人所指出的,字符串文字具有静态存储持续时间。

旁白:字符串文字的类型是
const char[N]
。将文本分配给非常量指针的能力是一种不受欢迎的向后兼容性攻击。(或者该功能是否已被删除?@Hurkyl-True,但这里没有这种情况。@Potatoswatter我猜他指的是标题missing
const
。应该编辑吗?。。。我不认为你的答案与第一个用户的答案几乎一模一样是巧合。@EvanCarslake我不会为了赢得一些分数而剽窃别人的答案。“这是一个巧合。”埃文斯·卡尔斯莱克说,他们都使用简洁的英语措辞,从标准语的狭窄词汇中进行选择,所以很可能是巧合。