为什么char*会导致未定义的行为而char []不会?

Ter*_* Li 9 c string char undefined-behavior

尝试修改字符串文字会导致未定义的行为:

char * p = "wikipedia"; 
p[0] = 'W'; // undefined behaviour
Run Code Online (Sandbox Code Playgroud)

防止这种情况的一种方法是将其定义为数组而不是指针:

char p[] = "wikipedia"; 
p[0] = 'W'; // ok
Run Code Online (Sandbox Code Playgroud)

为什么char*导致未定义的行为,而char[]不是?

Ker*_* SB 15

任何修改C字符串文字的尝试都有未定义的行为.编译器可以安排将字符串文字存储在只读存储器中(受OS保护,除非是在嵌入式系统上,否则不是字面上的ROM).但是语言并不需要这个; 这取决于你作为程序员来做到正确.

一个足够聪明的编译器可能会警告你应该将指针声明为:

const char * p = "wikimedia";
Run Code Online (Sandbox Code Playgroud)

虽然没有constC 的声明在C中是合法的(为了不破坏旧代码).但无论是否有编译器警告,这const都是一个非常好的主意.

(在C++中,规则是不同的; C++字符串文字,与C字符串文字不同,确实是const.)

使用文字初始化数组时,文字本身仍然存在于程序映像的可能只读区域中,但会将其复制到本地数组中:

char s[] = "wikimedia"; /* initializes the array with the bytes from the string */
char t[] = { 'w', 'i', ... 'a', 0 };  /* same thing */
Run Code Online (Sandbox Code Playgroud)

需要注意的是char u[] = *p工作-阵列只能从一个括号初始化另外从一个字符串初始化,并且字符数组.