关于指针的一个问题
在<C和指针>里面看到 int*m="hello";相当于把字符串的首地址赋值给m,但是我对*m赋值时,gcc编译通过了,但是执行时候报段错误,求大神帮忙指出问题所在,谢了 指针很强大,其实你的代码已经接触到它的强大之处了,只是你还没能很好地使用它。"hello world"严格来说是const char *型的数据,使用const char *型的数据对char *型的变量赋值,有些编译器会报错,有些会警告,当然强制类型转换也可完成赋值,这就是C语言的一个强大之处,连不可改变的数据也改变给你看。
你的问题是在*p = 'a'这里。"hello world"是常量,存放在静态数据区域,运行时由系统保障其不可更改,所以你对该数据区域的更改会导致系统报错。 原理上没错误,只是在编译的时候hello world这个字符串写到的内存被定义为只读的,*p='a';这句前面修改 p指针所在内存地址的内存属性为可读写,就能达到预期了 char *p=“Hello!”和char q[]=“Hello!”不一样,前者保存在数据区,运行时只是把他的地址放到栈里面去,所以它还是不可写的,后者也是字符串,字符串都保存在保存在常量区,但是运行时会把它复制到栈里面去,就可以改变了 所以*p=‘a’会报错,q=a就不会报错了 应该是char p[]=“hello,world”; 在 C中对指针有迷惑的,当你学了汇编后,一切以寄存器或内存地址为前提的编程后,你或许会或然开朗
页:
[1]