2

可能重复:
为什么会出现此段错误?
char a[] = “string”; 和有什么区别?和 char *p = “字符串”;

试图理解为什么 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;
}
4

3 回答 3

6

这是错误的,因为 C 标准说尝试修改字符串文字会产生未定义的行为。

究竟会发生什么可以而且会有所不同。在某些情况下,它会“起作用”——字符串文字的内容会改变为您所要求的内容(例如,回到 MS-DOS 时代,它通常会这样做)。在其他情况下,编译器将合并相同的字符串文字,例如:

char *a = "1234";
char *b = "1234";

a[1] = 'a';

printf("%s\n", b);

...会打印出来1a34,即使您根本没有明确修改b过。

在其他情况下(包括大多数现代系统),您可以预期尝试的写入完全失败,并且会抛出某种异常/信号。

于 2013-01-20T06:20:17.073 回答
2

您正在尝试修改驻留在实现定义的只读内存中的字符串文字,从而导致Undefined Behavior。请注意,未定义的行为并不保证您的程序崩溃,但它可能会向您显示任何行为。

好读:
char a[] = ?string?; 之间有什么区别?和 char *p = ?string?;?

于 2013-01-20T06:20:10.123 回答
0

我认为这种行为,一个好的或严厉的编译器不应该允许,因为这是 (char *s = "hello") 指向常量的指针,即修改内容将导致未定义的行为,如果编译器不会对此抛出任何错误

于 2013-01-20T06:57:46.867 回答