Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 字符串常数的修改_C - Fatal编程技术网

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个字符的文件。