当我将 char * 文字传递给 trim(( 时,它会出错,但是当我发送数组指针时,它起作用了,为什么这不起作用?
int main(void){
/* If instead I have a char s[100] = "Hi ";
* it works as intended so why does it not work when i pass this.*/
char *s = "Hi ";
printf("<%s>n", s);
trim(s);
printf("<%s>n", s);
}
/* Trims all white-space off at end of string. */
void trim(char *s){
while (*s != ' ') ++s;
--s;
while (*s == ' ') --s;
*(++s) = ' ';
}
修改字符串文字的内容是 C 语言中未定义的行为,这意味着它可能导致任何类型的不当行为,包括崩溃。从概念上讲,字符串文字是cost char *
的,但由于历史原因,它的类型是非常量。这意味着将字符串文本分配给char *
变量编译不会出错,但实际写入其中的程序不是有效的 C 程序。
崩溃的直接原因是编译器选择将字符串文本放在只读内存中。此类内存由操作系统保护,尝试修改它的程序会自动终止。