一个c语言字符指针问题!

[复制链接]
查看11 | 回复5 | 2012-5-2 20:53:30 | 显示全部楼层 |阅读模式
看了目前的回答,觉得还不完整。1、为什么不能修改:其实不一定,不让修改是一种保护。Linux kernel前一阵子报告的严重问题的就是可以修改这个东西了。如果能够修改,这个ch="abcdefg"的语义就不正确了。因为,假设如果有下面的程序:ch="abcdefg";printf("%s\n",ch);如果按照正常理解,应当总是打印"abcdefg",但是如果你刚才的那个能够执行,那可就不是了。看看下面的程序:bug:ch="abcdefg";printf("%s\n",ch);*(ch+...
回复

使用道具 举报

千问 | 2012-5-2 20:53:30 | 显示全部楼层
第一问:
错误的原因很简单,因为编译器默认是把"abcdefg"放在代码段,代码段是不可写的,所以会出错,如果你想修改的话,建议这样声明 char s[]="abcdefg"; char *ch = s;第二问:
可以这样
char **x;char *p;char str[20][10...
回复

使用道具 举报

千问 | 2012-5-2 20:53:30 | 显示全部楼层
1。已知:常量不允许修改,间接修改编译器检查不到,运行时才会报错,常量字符串也是常量 你这里是通过地址,间接地改变它所在区域的内容,这是非法的 2。 赋值可能不行,类型不匹配,2维指针不确定2维数组有多少列,间接地说一下,指针+1这样的运算,不知道要加多少便宜 3。 数组里面的就不是常量字符串了,它将字符串拷贝了一份存在自己的内存中,修改的是自己内存中的内容...
回复

使用道具 举报

千问 | 2012-5-2 20:53:30 | 显示全部楼层
第一问:
因为“abcdefg”这个字符串存放在C语言定义内存的静态存储区,这个区的特点是程序运行时不能修改其内容,而当指针指向这个存储区时,也当然不可以修改啦。可修改内容的区有内存栈区和...
回复

使用道具 举报

千问 | 2012-5-2 20:53:30 | 显示全部楼层
你自己有没有亲自测试过?你就确定网上说的都是真的?char *ch = “abcdefg"; *(ch+1)='a';真的不可以修改???建议还是自己亲自动手测试一下!附上测试代码:#incl...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行