免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4320 | 回复: 12
打印 上一主题 下一主题

为什么char* p指向的内容不能修改? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-12-15 13:13 |只看该作者 |倒序浏览
int main()
{
    char a[] = "hello";
    char* p = "hello";
    a[0] = 'x';  /* OK */
    p[0] = 'y';  /* core dump */
    return 0;
}

不能改好像大家都知道,但原理是什么呢?请大虾指教。

论坛徽章:
0
2 [报告]
发表于 2003-12-15 13:26 |只看该作者

为什么char* p指向的内容不能修改?

p只是一个指向char的指针,何来下标操作呢,p是个内存地址,那p[0]是没有实际意义的,个人这么认为

论坛徽章:
0
3 [报告]
发表于 2003-12-15 13:37 |只看该作者

为什么char* p指向的内容不能修改?

char* p指向的是一个内存地址,定义了这个指针后,系统并未分配内存空间给该指针指向的地址。所以:

  1. char a[5];
  2. char* p;
  3. p = a;
  4. p[0] = 'x';
复制代码
tommy 该用户已被删除
4 [报告]
发表于 2003-12-15 13:41 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2003-12-15 14:08 |只看该作者

为什么char* p指向的内容不能修改?

p[1]的形式的正确的。编译器会把它转成:
   *(p+1)
来处理。
其实跟*p = 'a';也是不行的。
mozila 该用户已被删除
6 [报告]
发表于 2003-12-15 14:12 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2003-12-15 14:12 |只看该作者

为什么char* p指向的内容不能修改?

我的例子里p指向的内容是经过初始化的。
单步运行可以看出在对*p赋值前(即coredump前),p指向的内容是一个字符串。

论坛徽章:
0
8 [报告]
发表于 2003-12-15 14:14 |只看该作者

为什么char* p指向的内容不能修改?

不能改是因为编译器把 char *p = "hello";所在的数据段标识为 .rdata,意为只读数据。在以前的贴子里讨论过的。http://bbs.chinaunix.net/forum/viewtopic.php?t=216180

如果你一定想改写该数据,就gcc/linux而言,有如下可选方案:

1。 在编译时加上 -fwriteable-strings 参数
2。先用 gcc 将  .c  文件转为 .s 文件, 然后将 .rdata 改为 .data 然后 .....

论坛徽章:
0
9 [报告]
发表于 2003-12-15 14:24 |只看该作者

为什么char* p指向的内容不能修改?

我对数组a[]和指针*p的生存期都作了试验:
全局,局部,静态。
结果是没有影响。
你们说的常量字符串的保存和保护数据的问题应该是有道理的。
但问题是对常量数据的保护是怎样实现的?
进程的内存分布究竟是什么样?
这部分数据是放在初始化数据区,还是未初始化数据,还是别的地方?

我觉得这种保护需要特殊的机制才能实现,有没有可能是把这部分数据放在代码段里?

哪位有这方面的资料,帮帮忙吧。

论坛徽章:
0
10 [报告]
发表于 2003-12-15 14:38 |只看该作者

为什么char* p指向的内容不能修改?

*p="foo" 中的内容放在已初始化数据区。
*p="foo" 本质上是全局的,即使你把它放在函数里。
*p="foo" 不是常量数据,即与 const 数据是完全不同的。在 c 语言中,const 数据是通过编译器来保护的,实际上容易欺骗编译器,从而修改const数据。而 *p="foo" 是通过操作系统来保护的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP