字符串常量的修改

时间:2012-03-07 07:14:37

标签: c

char* p ="good"; 
p[2] = 'a';

我的理解 good 存储在只读存储器中。所以它无法修改。 但在Visual Studio 8中,它没有给出任何错误。任何人都可以解释这里发生的事情。

3 个答案:

答案 0 :(得分:3)

您正在做的是未定义的行为。这意味着您无法猜测会发生什么,因为它将取决于编译器,操作系统,工作日和月亮阶段。

在某些情况下,您会看到它“正常工作”,就像您被允许写入一样,在其他情况下您可能会崩溃...在其他情况下,您可以进行更改以改变该字符串和其他字符串(例如包含来自程序其他部分的"hmmm... this is good"的字符串文字。

在C和C ++中,你不能指望系统在你犯错时帮助你......假设你不会犯错误。所以就是不要这样做。

没有运行时错误天使可以帮助您使用这些语言,只是未定义的行为守护进程等待您通过让您哭泣来取笑您。

答案 1 :(得分:1)

在向程序员或用户报告问题的意义上,UB不需要“给出错误”。仅仅调用UB 是一个错误,你必须意识到这一点而不是这样做。

答案 2 :(得分:0)

由于您将p声明为char *而非const char *,因此您“被允许”从编译器的角度更改内容p点并在运行时,但至少应该收到一个警告,指定将字符串常量赋给char *

换句话说,这就是问题所在:

char* p ="good"; 

但你会在这里崩溃:

p[2] = 'a';