C 字符串常数的修改
据我所知,好的东西存储在只读存储器中。所以它不能被修改。C 字符串常数的修改,c,C,据我所知,好的东西存储在只读存储器中。所以它不能被修改。 但是在VisualStudio8中,它没有给出任何错误。谁能解释一下这里发生了什么。既然你声明p为char*而不是const char*,你就“被允许”从编译器的角度更改p点的内容,并在运行时崩溃,但是,如果将字符串常量指定给char*,则至少应该得到一个警告 换句话说,这就是问题所在: char* p ="good"; p[2] = 'a'; 但你会在这里崩溃: char* p ="good"; 由于您将p声明为char*而不是
但是在VisualStudio8中,它没有给出任何错误。谁能解释一下这里发生了什么。既然你声明
p
为char*
而不是const char*
,你就“被允许”从编译器的角度更改p
点的内容,并在运行时崩溃,但是,如果将字符串常量指定给char*
,则至少应该得到一个警告
换句话说,这就是问题所在:
char* p ="good";
p[2] = 'a';
但你会在这里崩溃:
char* p ="good";
由于您将
p
声明为char*
而不是const char*
,因此“允许”您从编译器的角度将p
点的内容更改为,并在运行时崩溃,但您至少应该收到一条警告,提示您将字符串常量指定给char*
换句话说,这就是问题所在:
char* p ="good";
p[2] = 'a';
但你会在这里崩溃:
char* p ="good";
UB在向程序员或用户报告问题时不需要“给出错误”。仅仅调用UB是一个错误,您必须意识到这一点,而不是这样做。UB不需要“给出错误”,即向程序员或用户报告问题。仅仅调用UB是一个错误,您必须意识到这一点,而不是这样做。您所做的是未定义的行为。这意味着你无法猜测将会发生什么,因为这将取决于编译器、操作系统、工作日和月相 在某些情况下,你会看到它“工作”,就好像你被允许写作,在其他情况下,你可能会崩溃。。。在其他情况下,您可以对该字符串和其他字符串进行更改(例如,程序另一部分中包含
“hmmm…这很好”
)
在C和C++中,当你犯错误时,你不能指望系统帮助你。假设你不会犯错误。所以别那么做
在这些语言中没有运行时错误天使可以帮助您,只有未定义的行为守护进程等待着通过让您哭泣来取笑您。您正在做的是未定义的行为。这意味着你无法猜测将会发生什么,因为这将取决于编译器、操作系统、工作日和月相 在某些情况下,你会看到它“工作”,就好像你被允许写作,在其他情况下,你可能会崩溃。。。在其他情况下,您可以对该字符串和其他字符串进行更改(例如,程序另一部分中包含
“hmmm…这很好”
)
在C和C++中,当你犯错误时,你不能指望系统帮助你。假设你不会犯错误。所以别那么做
在这些语言中,没有运行时错误天使可以帮助您,只有未定义的行为守护进程等待着通过让您哭泣来取笑您。这个问题已经被问了很多次了。“我们怎样才能让它停止?”卡尔·诺伦,你知道答案吗?这个问题已经被问了很多很多次了。我们怎样才能让它停止?@Carl Norum,你知道答案吗?但是p[2]=“a”;这里不是崩溃,未定义的行为是未定义的。它可能会崩溃,也可能不会。它可能会删除您计算机上每个名称为7个字符的文件;这里不是崩溃,未定义的行为是未定义的。它可能会崩溃,也可能不会。它可能会删除您计算机上每个名称为7个字符的文件。