一个 c 风格字符串与指针问题

2017-05-09 15:27:09 +08:00
 di94sh
char *s1=“ hello ”;
char *s2=“ xello ”;
*s2= *s1 ;
这样为什么不行呢。
我希望 printf s2 输出一个 hello

这样编译可以,运行出错。环境试了 gcc 与 vs2010
4247 次点击
所在节点    C
54 条回复
baixiangcpp
2017-05-09 17:05:44 +08:00
ISOIEC 9899:2011 6.4.5 第 6 条
It is unspecified whether these arrays are distinct provided their elements have the
appropriate values. If the program attempts to modify such an array, the behavior is
undefined.
bombless
2017-05-09 17:07:29 +08:00
@greatghoul 不知道会不会往精彩的方向发展
XDDD
2017-05-09 17:10:53 +08:00
@eoyx c 语言的问题就要用 c 语言来解释。你给的只是某种情况下底层的实现方式,和问题一点关系都没有
另外嘴巴真脏
fy
2017-05-09 17:11:17 +08:00
桌椅板凳,有杀气
pright
2017-05-09 17:16:53 +08:00
@eoyx
哟,就懂个 32 位汇编真了不起,可惜我不用 x86,你咬我啊
lishunan246
2017-05-09 17:35:54 +08:00
char *s="hello",是把一个指向 const char 数组的指针,转换成 char 指针赋给 s。
char s[]="hello",是定义一个叫 s 的 char 数组。
两句话区别很大。
shuax
2017-05-09 17:41:27 +08:00
楼都歪了。进入看戏模式。
wevsty
2017-05-09 17:58:44 +08:00
@bombless
说的是正确的,在不同的平台和架构下可能会有不同的实现方式,Windows 下面是做了一个映射,所以 Windows 下面可以使用 VirtualProtect 来修改属性达到修改的目的。
@eoyx
至于为什么那个内存空间是不可写的,在不同的架构上会有不同的处理方法,说要懂常见架构的原理固然是没什么错误的,但是不要把所有人当傻 x。技术上你没说错,但没准人家真就不用 x86 呢。
抛开这一点,我看到了浓浓的自我优越感,也是事实。
wevsty
2017-05-09 18:02:28 +08:00
最后,作为一个开发者,我觉得应该尽可能的避免使用一些依赖于平台或者特定架构的一些技巧。
编译器怎么处理这段内存那是编译器的事情,想强行修改字符串常量这种做法就应该是要尽可能避免的,因为这是未定义的行为。
josephshen
2017-05-09 18:14:30 +08:00
zjp
2017-05-09 18:37:42 +08:00
讨论 C 语言的帖子都能丰富 bolck 名单…
choury
2017-05-09 18:43:01 +08:00
@eoyx 我用的是 PowerPC,你怎么解释呢?
jarell
2017-05-09 18:48:16 +08:00
@zjp 还在用 block 说明你的心还不能像冰面一样平静
Livid
2017-05-09 19:07:06 +08:00
@josephshen 谢谢举报。已经处理。
lrxiao
2017-05-09 19:32:19 +08:00
....这什么鬼..又是对 C/C++研究汇编的
owt5008137
2017-05-09 19:32:31 +08:00
因为你用 char*的时候栈上就一个指针,指向常量区的.text 段里的数据。这个段默认是只读的。你用系统 api 强行改成可写就能改了,但是这么暴力不太好不是?

而用 char[]的时候数据在栈上
lcsoft
2017-05-09 20:45:15 +08:00
某人占点优势就喷别人不懂装懂,外加傻逼、弱智、畜生、愚昧、无知、张狂这些词教别人如何做人。可以,这很牛逼。
Vfeather
2017-05-09 20:53:22 +08:00
一楼,三楼,都没毛病
lechain
2017-05-09 21:04:19 +08:00
其实楼主的问题和问 为什么用 const char*p 定义的指针 p 无法通过*p 操作修改内容 p 所指向的变量一样...

研究研究以下这两组区别:
指针变量 和 指针所指向的变量;
const char* p 和 char* const p;
raiz
2017-05-09 21:10:52 +08:00
定义出来的字符串指针 s1,s2 指向的是常量,值不可修改

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/360139

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX