为什么这是错的?

时间:2013-01-20 06:18:40

标签: c

  

可能重复:
  Why does this Seg Fault?
  What is the difference between char a[] = “string”; and char *p = “string”;

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

3 个答案:

答案 0 :(得分:6)

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

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

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

a[1] = 'a';

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

...会打印1a34,即使您从未明确修改过b

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

答案 1 :(得分:2)

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

好读:
What is the difference between char a[] = ?string?; and char *p = ?string?;?

答案 2 :(得分:0)

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