免费注册 查看新帖 |

Chinaunix

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

指针,,字符,,段错误,请教?? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-12 16:34 |只看该作者 |倒序浏览
gcc编过这样为啥会在运行出现段错误:
        char *s="abc";               
        *(s+1)='d';
                printf("================%c \n",*(s+1));       
而这样就正常:
        char *s="abc";               
        printf("================%c \n",*(s+1));        打印出来b
高手解惑啊!

另外在TC下运行却是都正常的!!!

论坛徽章:
0
2 [报告]
发表于 2006-12-12 16:40 |只看该作者
我是菜鸟。。说一点
第一段代码的行为是undefined。。。。每个具体编译器都不一样。。
一般都把"abc"这样的数据都放在.data段中。。这些一般不准写入的。。。
所以*(s+1)出现段错误。。

而第二段是读入......就是读取.data中的数据。。这是没有问题的。。

论坛徽章:
0
3 [报告]
发表于 2006-12-12 16:51 |只看该作者

回复 2楼 redhat008 的帖子

原帖由 redhat008 于 2006-12-12 16:40 发表
我是菜鸟。。说一点
第一段代码的行为是undefined。。。。每个具体编译器都不一样。。
一般都把"abc"这样的数据都放在.data段中。。这些一般不准写入的。。。
所以*(s+1)出现段错误。。

而第二段 ...

哦,是吗,呵呵,这样就可以想通了,但我不明白什么是.data段啊,它和内存,和地址有什么关系啊,高手解答啊,

论坛徽章:
0
4 [报告]
发表于 2006-12-12 17:00 |只看该作者
呵呵~~楼主,你指针指向的是常量

论坛徽章:
0
5 [报告]
发表于 2006-12-12 17:07 |只看该作者
原帖由 toiby 于 2006-12-12 17:00 发表
呵呵~~楼主,你指针指向的是常量



??常量??是啊,那为什么TC下可以改变常量的值!

论坛徽章:
0
6 [报告]
发表于 2006-12-12 17:13 |只看该作者
如果用char s[]="abc"应该就没问题了~~~

论坛徽章:
0
7 [报告]
发表于 2006-12-12 18:04 |只看该作者
>> (toiby) 呵呵~~楼主,你指针指向的是常量
>> (绿茶主演) ??常量??是啊,那为什么TC下可以改变常量的值!

根据目前各自标准的规定,字符串(string literal,如 "abc") 在 C 中不属于常量(人们却经常误认为它是常量),在 C++ 中是常量。无论是 C 还是 C++ 就不允许改变字符串,否则是无定义的。所以 C 中的字符串处于一种比较尴尬的境地:不是常量,不过却不允许对其进行修改。

论坛徽章:
0
8 [报告]
发表于 2006-12-12 20:05 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
9 [报告]
发表于 2006-12-12 20:14 |只看该作者
原帖由 jamesr 于 2006-12-12 20:05 发表
总觉得tc没有gcc好,而且还还是16位的。


DOS 下可以用 DJGPP,Watcom C 的 32 位版本也可以

保护模式和实模式各有利弊,在不同的地方有不同的用途。当然,用什么编译器都是殊途同归的,最终都要生成机器码。编译器支持 C99 我就心满意足了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP