我?陈安! 发表于 2015-11-3 16:55:02

关于指针的一个问题

在<C和指针>里面看到   int*m="hello";相当于把字符串的首地址赋值给m,但是我对*m赋值时,gcc编译通过了,但是执行时候报段错误,求大神帮忙指出问题所在,谢了

故乡的风 发表于 2015-11-5 09:07:44

指针很强大,其实你的代码已经接触到它的强大之处了,只是你还没能很好地使用它。
"hello world"严格来说是const char *型的数据,使用const char *型的数据对char *型的变量赋值,有些编译器会报错,有些会警告,当然强制类型转换也可完成赋值,这就是C语言的一个强大之处,连不可改变的数据也改变给你看。
你的问题是在*p = 'a'这里。"hello world"是常量,存放在静态数据区域,运行时由系统保障其不可更改,所以你对该数据区域的更改会导致系统报错。

machimilk 发表于 2015-11-5 13:17:26

原理上没错误,只是在编译的时候hello world这个字符串写到的内存被定义为只读的,*p='a';这句前面修改 p指针所在内存地址的内存属性为可读写,就能达到预期了

想不出来 发表于 2015-11-5 19:08:24

char *p=“Hello!”和char q[]=“Hello!”不一样,前者保存在数据区,运行时只是把他的地址放到栈里面去,所以它还是不可写的,后者也是字符串,字符串都保存在保存在常量区,但是运行时会把它复制到栈里面去,就可以改变了    所以*p=‘a’会报错,q=a就不会报错了

wangchunchun 发表于 2015-11-6 23:09:32

应该是char p[]=“hello,world”;

zph888 发表于 2015-11-8 11:12:20

在 C中对指针有迷惑的,当你学了汇编后,一切以寄存器或内存地址为前提的编程后,你或许会或然开朗
页: [1]
查看完整版本: 关于指针的一个问题