C 为什么这是错误的?
可能重复:C 为什么这是错误的?,c,C,可能重复: 试图理解s[0]=“H”失败的原因。我猜这与进程内存中的数据段有关,但也许有人能更好地解释一下 void str2 (void) { char *s = "hello"; printf("%s\n", s); s[0] = 'H'; //maybe this is a problem because content in s is constant? printf("%s\n", s); } int main() {
试图理解s[0]=“H”失败的原因。我猜这与进程内存中的数据段有关,但也许有人能更好地解释一下
void str2 (void)
{
char *s = "hello";
printf("%s\n", s);
s[0] = 'H'; //maybe this is a problem because content in s is constant?
printf("%s\n", s);
}
int main()
{
str2();
return 0;
}
您正试图修改一个字符串文字,它驻留在实现定义的只读内存中,从而导致未定义的行为。请注意,未定义的行为并不保证程序崩溃,但它可能会显示任何行为 读得好:
这是错误的,因为C标准规定,试图修改字符串文字会产生未定义的行为 确切地说,将要发生的事情可以而且会有所不同。在某些情况下,它会“起作用”——字符串文本的内容将更改为您所要求的内容(例如,在MS-DOS时代,它通常是这样做的)。在其他情况下,编译器将合并相同的字符串文字,例如:
char *a = "1234";
char *b = "1234";
a[1] = 'a';
printf("%s\n", b);
…将打印出1a34
,即使您从未明确修改过b
在其他情况下(包括大多数现代系统),您可以期望尝试的写操作完全失败,并引发某种异常/信号。我认为这种行为,一个好的或严格的编译器不应该允许,因为这是(char*s=“hello”)指向常量的指针,即如果编译器不会对此抛出任何错误,修改内容将导致未定义的行为。我正在windows上运行此程序,收到一条“应用程序崩溃”消息。欢迎使用SO。除了是重复的,你的问题标题也不会有太多的帮助,以澄清你是什么。多么胡说八道的问题名称!!!