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

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

char * p = "wikipedia"; p[0] = 'W'; // undefined behaviour 

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

 char p[] = "wikipedia"; p[0] = 'W'; // ok 

为什么char*会导致未定义的行为,而char[]却没有?

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

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

 const char * p = "wikimedia"; 

虽然没有const的声明在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 */ 

请注意, char u[] = *p不起作用 – 数组只能从大括号初始化程序初始化,而char数组也可以从字符串文字中初始化。