设置const char *是否等于char [] literal安全?

时间:2017-04-14 02:53:41

标签: c++ string

我在一些C ++代码中找到了这个:

const char *scaryPointer = "literal";

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

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

如果安全,如果您将scaryPointer重新分配给新文字,会发生什么?旧文字的地址会自动释放吗?自动垃圾收集?

我找到this question,但(我认为)问题/答案并没有完全解决我的问题。顾虑。

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

const char *notScaryPointer = "literal";完全有效C.它是指向只读内存中char的指针。您可以稍后将其重新分配为notScaryPointer = "some_other_literal";。但由于分配给字符串文字的const char*位于只读内存中,因此无法更改它们。例如。此代码段可能会给您一个运行时错误:
const char* strPointer = "Hello, world!"; strPointer[0] = 'Y';

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

编辑:我最初没有注意到你的问题,但正如其他人所指出的那样,字符串文字有静态存储持续时间。