Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.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,可能重复: 试图理解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。除了是重复的,你的问题标题也不会有太多的帮助,以澄清你是什么。多么胡说八道的问题名称!!!