当我输入指向字符串文字的指针时,为什么程序返回seg错误但是当我输入指向数组的指针时却没有?

时间:2018-04-20 04:32:29

标签: c pointers char-pointer

当我将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';
}

1 个答案:

答案 0 :(得分:4)

修改字符串文字的内容是C中未定义的行为,这意味着它可能导致任何类型的错误行为,包括崩溃。从概念上讲,字符串文字是cost char *,但由于历史原因,它的类型是非常量的。这意味着将字符串文字分配给char *变量可以无错误地编译,但实际写入的程序不是有效的C程序。

崩溃的直接原因是编译器选择将字符串文字放在只读内存中。这样的内存由操作系统保护,尝试修改它的程序会自动终止。