新系统中调用strcpy(char*,char*)运行出错了,在老系统中是好的(请教)

flysky 2008-07-03 08:21:21
例如:
#include <stdio.h>
#include <stdlib.h>

int main() {
char* fmtstr = "000.000";
char* fmttype = "ZZZ.Z99";

strcpy(fmtstr , fmttype);
printf("%s\n", fmtstr);
}

现在做一个程序的移植,在老系统(HP-UNIX 11)上是可以正常运行上面的例子,可是移植到新系统(HP-UNIX 11i v3)上面,虽然能编译通过,但是运行时在strcpy那句出现致命错误Segmentation fault (core dumped).如果将char* fmtstr改为char fmtstr[],是能正常运行的.
所以请问大家,为什么原来用char* fmtstr可以,而现在不可以了呢.是编译器的问题吗或者是编译器的option问题吗,不解.望高手告知一二.
...全文
174 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
maxyan 2008-07-04
  • 打赏
  • 举报
回复
应该是编译器的差异,对const数据编译后放入的段不同,与OS无关。楼主可以用dump工具dump一下可执行文件看看里面的段分配
马上就会明白为什么出错。
ForestDB 2008-07-04
  • 打赏
  • 举报
回复
- -!!!
......
沙漠里的海豚 2008-07-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ttkk_2007 的回复:]
char* fmttype = "ZZZ.Z99";
fmttype指向常量字符串,你往里拷贝肯定不行,换成char fmttype[]就可以,因为实在堆栈分配内存
说实话,你以前的可以我也很怀疑
[/Quote]

是啊,很奇怪,竟然可以往指向常量的内存更新数据,楼主看看你以前的是不是搞错了啊
flysky 2008-07-04
  • 打赏
  • 举报
回复
经过调查确认是编译器的升级造成,新的编译器都是默认将固定字符串放在只读数据段里,所以对于HP-UX11iv3的新编译要加上选项+Olit=none才能改变默认选项.
mymtom 2008-07-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 HelloDan 的回复:]
引用 7 楼 bfqnnui 的回复:
6楼你说的意思我知道,我是想问为什么在老系统上能够运行正常呢,是不是和编译器有关,还是和系统有关?


6楼的说对了,以前的TC也可以这样,但现在的编译器都不行了,因为那样根本是错的。
[/Quote]
mymtom 2008-07-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 bfqnnui 的回复:]
6楼你说的意思我知道,我是想问为什么在老系统上能够运行正常呢,是不是和编译器有关,还是和系统有关?
[/Quote]
和编译器有关。
新的编译器会吧这种数据放在只读数据节(.rodata)中.

.file "hello.c"
.section .rodata
.LC0:
.string "hello"
.text
.p2align 4,,15
.globl main
.type main, @function
shi8430419 2008-07-04
  • 打赏
  • 举报
回复
指向常量的内存不能进行写操作啊!
Darkneece 2008-07-04
  • 打赏
  • 举报
回复
HP-unix11没有内存管理?
HelloDan 2008-07-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 bfqnnui 的回复:]
6楼你说的意思我知道,我是想问为什么在老系统上能够运行正常呢,是不是和编译器有关,还是和系统有关?
[/Quote]

6楼的说对了,以前的TC也可以这样,但现在的编译器都不行了,因为那样根本是错的。
lijpbasin 2008-07-03
  • 打赏
  • 举报
回复
确定是不是编译器的问题,楼主可以在新系统上用旧的编译器试试啊
虽然不懂那两个系统是什么关系,看出来后者是前者较新的版本,应该对旧的编译器兼容的。
flysky 2008-07-03
  • 打赏
  • 举报
回复
6楼你说的意思我知道,我是想问为什么在老系统上能够运行正常呢,是不是和编译器有关,还是和系统有关?
ttkk_2007 2008-07-03
  • 打赏
  • 举报
回复
char* fmttype = "ZZZ.Z99";
fmttype指向常量字符串,你往里拷贝肯定不行,换成char fmttype[]就可以,因为实在堆栈分配内存
说实话,你以前的可以我也很怀疑
kkndciapp 2008-07-03
  • 打赏
  • 举报
回复
。。。
zhang_db 2008-07-03
  • 打赏
  • 举报
回复
对指向常量的字符串指针怎么修改值?
jieao111 2008-07-03
  • 打赏
  • 举报
回复
lionc650 2008-07-03
  • 打赏
  • 举报
回复
char* fmtstr = "000.000";
char* fmttype = "ZZZ.Z99";

strcpy(fmtstr , fmttype);
这么写感觉哪儿都应该出错啊....,对HP-UNIX完全不懂....
jieao111 2008-07-03
  • 打赏
  • 举报
回复
不同系统占用的内存不一样?

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧