为什么“char *”可以指向“const char *”?

可以在VC或gcc上正确编译以下代码:

char *str = "I am a const!"; str[2] = 'n'; 

但是,显然存在运行时错误。 因为“我是一个常客!” 是一个const char *,为什么编译器不会给出错误甚至是警告?


此外,如果我定义char a[] = "I am const!" ,a中的所有元素都可以修改,为什么这次字符串文字变得不nonconst

就C而言,该字符串文字不是const,它是一个char[14] ,你分配给一个char *,这是完全没问题的。

但是,C确实说改变字符串文字是未定义的行为。