This question already has answers here:
Why do I get a segmentation fault when writing to a string initialized with “char *s” but not “char s[]”?
                                
                                    (17个答案)
                                
                        
                                2年前关闭。
            
                    
当我将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 != '\0') ++s;

    --s;
    while (*s == ' ') --s;
    *(++s) = '\0';
}

最佳答案

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

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

关于c - 为什么当我输入指向字符串文字的指针时程序会返回段错误,而不是当我输入指向数组的指针时却返回seg错误? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49934030/

10-15 02:08