2017-04-14 73 views
0

我发现这在一些C++代码:设置一个const char *等于char []文字安全吗?

const char *scaryPointer = "literal"; 

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

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

如果安全,如果您将scaryPointer重新指定为新文字,会发生什么情况?旧文字的地址会自动释放呢?自动垃圾收集?

我发现this question,但(我认为)这些问题/答案没有完全解决我的问题&的问题。

+2

另外:字符串文字的类型是'const char [N]'。将文字分配给非常量指针的能力是deprectaed向后兼容性hack。 (或者已经删除了该功能?) – Hurkyl

+1

@Hurkyl真的,但这不是在这里发生的。 – Potatoswatter

回答

7

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

2

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

+1

......我不认为这是巧合,你的答案几乎与第一位用户的答案完全相同。 –

+2

@EvanCarslake我不会剽窃他人的答案只是为了赢得一些积分。这是巧合。 –

+4

@EvanCarslake他们都使用简洁的英语措辞,从狭义的标准词汇中进行选择,所以巧合很可能。 – Potatoswatter

2

const char *notScaryPointer = "literal";是完全有效的C.它是在只读存储器中指向char的指针。稍后您可以重新分配它,如notScaryPointer = "some_other_literal";。但是因为const char*被分配到一个字符串文字居住在只读存储器中,所以你不能改变它们。例如。此代码段可能会给你一个运行时错误:
const char* strPointer = "Hello, world!"; strPointer[0] = 'Y';

如果你想可变字符串,然后指针char旨意无法正常工作。如果这是你想要的,然后使用char的数组。

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