请问:指向字符串的指针为何不能用来修改此字符串(c语言)

请教:指向字符串的指针为何不能用来修改此字符串(c语言)
各位大侠:

  我原本打算使用指向一个字符串的指针来修改这个字符串,代码如下:
C/C++ code
char *m = "hello";
    *(m+1) = 's';
    for(;*m != '\0';m++){
        printf("%c\n",*m);
    }

但是出运行时错误。
----------------------
我用数组下标的方式是可以修改的:
C/C++ code
int i = 0;
    char w[] = "hello";
    w[1] = 's';
    
    while(w[i] != '\0'){
        printf("%c\n",w[i]);
        i++;
    }

----------------------
请大侠赐教为什么使用指针不能修改指向的这个字符串呢,谢谢!


------解决方案--------------------
char *m = "hello";这个是常量,不能修改
------解决方案--------------------
有种东西叫字符串常量,理解为只读
------解决方案--------------------
char *m = "hello";<=>const char*m="hello";
------解决方案--------------------
char *m = "hello";
"hello"保存在静态数据区,该数据不能修改.
由指针m指向. 不能通过指针m来修改静态数据区的值.

char w[] = "hello";
"hello"保存在栈空间数组里. 数组名为w, 函数名为数组的首地址.
可以通过w[i]='a', 或*(w+i)='a'的形式来修改数组内容.

------解决方案--------------------
探讨

char *m = "hello";
"hello"保存在静态数据区,该数据不能修改.
由指针m指向. 不能通过指针m来修改静态数据区的值.

char w[] = "hello";
"hello"保存在栈空间数组里. 数组名为w, 函数名为数组的首地址.
可以通过w[i]='a', 或*(w+i)='a'的形式来修改数组内容.

------解决方案--------------------
char *m = "hello";
"hello"保存在文字常量区,该数据不能修改,默认有只读属性.
由指针m指向. 不能通过指针m来修改此值.

char w[] = "hello";
"hello"保存在栈空间数组里. 数组名为w, 函数名为数组的首地址.
可以通过w[i]='a', 或*(w+i)='a'的形式来修改数组内容.

------解决方案--------------------
指针哪里都能指,不过你碰巧指向了不可更改的地方。

------解决方案--------------------
指针可以指向常量
不过常量的内容还是不能修改啊