免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: jeanlove
打印 上一主题 下一主题

[C] 请问strcpy为何导致"段错误",很短的小程序 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-02-16 09:31 |只看该作者
内存读写错误,编译器在处理char *xxx = "yyy"时,会将字符串放到一个具有const属性的段上(该内存属性为只读的),所以在第二次strcpy时程序会尝试的修改这个字符串,从而引起内存的保护异常。你可以将第二次strcpy try{}一下,然后catch(...){ cout << "Hello World";}随便输出一句话,如果这句话输出了那就说明有seh产生,之所以会出现段错误是因为你没有处理这个异常,在windows下就会弹出一个对话框

[ 本帖最后由 flyingtime 于 2009-2-16 09:47 编辑 ]

论坛徽章:
2
2015亚冠之莱赫维亚
日期:2015-09-14 11:19:42操作系统版块每日发帖之星
日期:2015-11-05 06:20:00
12 [报告]
发表于 2009-02-16 09:58 |只看该作者
楼上很多位都说的很明白了
应该是第2次COPY出错
strcpy(s,buf);~

论坛徽章:
0
13 [报告]
发表于 2009-02-16 10:02 |只看该作者
原帖由 nickiii 于 2009-2-15 22:36 发表
"abc"表示的是字符串常量
char b[]="abc";表示char数组b,里面存放的是'a','b','c','/0',表示字符串,和"abc"并不是同一内存地址

int len=strlen(s);
    char buf[len+1];

这句有问题吧,我编译都通不 ...

这句话没有错,除了古老的编译器,新的编译器都支持buf[len+1],分配在堆栈上的变长数组

论坛徽章:
0
14 [报告]
发表于 2009-02-16 10:19 |只看该作者
谢谢上面各位dx的回答,但是还是有个疑问:

为什么写成
char b[]="abc";
的时候,"abc"就不是数据区里面的string literals,而是分配在堆栈上?

都是常量的形式啊!

谢谢!!!!!!!!!!!!

论坛徽章:
0
15 [报告]
发表于 2009-02-16 10:22 |只看该作者
原帖由 jeanlove 于 2009-2-16 10:19 发表
谢谢上面各位dx的回答,但是还是有个疑问:

为什么写成
char b[]="abc";
的时候,"abc"就不是数据区里面的string literals,而是分配在堆栈上?

都是常量的形式啊!

谢谢!!!!!!!!!!!!

编译器就是这样做的,或许是因为相关标准

论坛徽章:
0
16 [报告]
发表于 2009-02-16 10:32 |只看该作者
原帖由 jeanlove 于 2009-2-16 10:19 发表
谢谢上面各位dx的回答,但是还是有个疑问:

为什么写成
char b[]="abc";
的时候,"abc"就不是数据区里面的string literals,而是分配在堆栈上?

都是常量的形式啊!

谢谢!!!!!!!!!!!!

"abc"会在cosnt段中有一个副本,这个是不能修改的。而char b[];会在堆栈上建立一个大小为strlen("abc")的空间,并将"abc"复制到char b[]里面,而这段内存是可读可写的(堆栈),你在第二次操作strcpy时,实际操作的是char b[];即堆栈空间

论坛徽章:
0
17 [报告]
发表于 2009-02-16 21:59 |只看该作者
f("abc")中的字符串“abc”在只读数据区存放,也就是常说的.rodata section,没法修改;
后面的char b[]字符串是函数局部变量,运行时在堆栈上分配;
不是一个概念
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP