char* p ="good";
p[2] = 'a';
我的理解 good 存储在只读存储器中。所以它无法修改。 但在Visual Studio 8中,它没有给出任何错误。任何人都可以解释这里发生的事情。
答案 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';