我在一些C ++代码中找到了这个:
const char *scaryPointer = "literal";
令我惊讶的是,这不会生成编译器警告或错误(至少在Visual Studio 2008中)。
这样做真的安全吗?我认为在该行完成执行后,char []文字的地址将无效。
如果安全,如果您将scaryPointer
重新分配给新文字,会发生什么?旧文字的地址会自动释放吗?自动垃圾收集?
我找到this question,但(我认为)问题/答案并没有完全解决我的问题。顾虑。
答案 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
的数组。
编辑:我最初没有注意到你的问题,但正如其他人所指出的那样,字符串文字有静态存储持续时间。