当我将char * literal传递给trim()时会出现seg错误,但是当我发送一个数组指针时,它会起作用,为什么这不起作用?
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 != '\0') ++s;
--s;
while (*s == ' ') --s;
*(++s) = '\0';
}
答案 0 :(得分:4)
修改字符串文字的内容是C中未定义的行为,这意味着它可能导致任何类型的错误行为,包括崩溃。从概念上讲,字符串文字是cost char *
,但由于历史原因,它的类型是非常量的。这意味着将字符串文字分配给char *
变量可以无错误地编译,但实际写入的程序不是有效的C程序。
崩溃的直接原因是编译器选择将字符串文字放在只读内存中。这样的内存由操作系统保护,尝试修改它的程序会自动终止。