在C中初始化字符串

Anu*_*wal 1 c arrays string

可能重复:
char*str ="STRING"和char str [] ="STRING"之间的区别?

我写了以下代码:

int main()
{
    char *str = "hello";
    str[0] = 'H';
    printf("%s\n", str);
}
Run Code Online (Sandbox Code Playgroud)

这给了我一个分段错误,我不明白为什么.

strpointer to char不是const char.即使是这样的情况也不应该像下面的程序那样给出编译错误:

int main()
{
    const char *str = "hello";
    str[0] = 'H';
    printf("%s\n", str);    
}
Run Code Online (Sandbox Code Playgroud)

它给出了一个错误:assignment of read-only location *str.

编辑

如果我的代码将指针放在只读位置,我不应该得到编译错误?

Ser*_* L. 5

您指定一个指向常量字符串的指针(它作为文本的一部分,因此不是可写内存).

修复char str[] = "hello";此问题将在堆栈上创建常量字符串的ar/w副本.

你做的是一个完全有效的指针赋值.编译器不知道的是,在标准系统中,常量字符串放在只读存储器中.在嵌入式(或其他奇怪的)系统上,这可能是不同的.

根据您的系统,您可以使用mprotect并将指针目标上的VM标志更改为可写.因此编译器允许使用此代码,但您的操作系统不会.