BBS.ChinaUnix.net
首页 | 新闻 | Linux | FreeBSD | AIX | Windows | 博客 | 论坛 | 存储 | 网络 | 人才 | Wiki | 资料 | 读书 | 手册 | 下载 | 空间 | 搜索
  会员: 密码: 免费注册 | 忘记密码 | 会员登录 | 搜索 | 帮助 


奥运快报: 
奥运热点:
 

[函数] 新系统中调用strcpy(char*,char*)运行出错了,在老系统中是好的(请教)
首页 » 论坛 » C/C++ »  
[打印] [订阅] [收藏] [本帖文本页] [推荐此主题给朋友,立即获积分]
qnnui
侠客




UID:705229
注册:2008-5-14
最后登录: 2008-07-13
帖子:16
精华:1

可用积分:21 (白手起家)
信誉积分:0
空间积分:0 (白手起家)
专家积分:0 (本版)

状态:...离线...

[个人空间] [短信] [博客]


[推广] 顶部
1楼 发表于 2008-7-3 20:23 
C程序例如:
#include <stdio.h>
#include <stdlib.h>

int main() {
char* fmtstr = "000.000";  // 如果这句改为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问题吗,不解.望高手告知一二.



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
prolj (非常女生)
法王
专业水帖


CU奥运火炬传递手2008
UID:293231
注册:2005-7-19
最后登录: 2008-08-29
帖子:12167
精华:3

可用积分:10170 (大富大贵)
信誉积分:560
空间积分:0 (白手起家)
专家积分:20 (本版)

来自:乡下
状态:...保密...

[个人空间] [短信] [博客]


[推广] 顶部
2楼 发表于 2008-7-3 20:28 
char* fmtstr = "000.000";  // 如果这句改为char fmtstr[]="000.000",是能正常运行的.
char* fmttype = "ZZZ.Z99";

不能吧?"000.000"和"ZZZ.Z99"都是只读的。改为char fmtstr[]="000.000","000.000"仍然放在只读数据段,程序给fmtstr[]在栈中分配空间,然后把放在只读数据段中的"000.000"拷到栈中fmtstr[]数组中去,然后fmtstr[]就可以被改变了,但是字符串常量"000.000"仍然是不变的。

[ 本帖最后由 prolj 于 2008-7-4 05:49 编辑 ]



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

别没事瞎搞意识强奸,大家都不是8岁小孩了,你又不是赵本山,想给别人洗脑啊?先回家对着镜子把自己洗成白痴去!
把自己塑造成神搞个人崇拜啊?你不就是会装13吗?对不起,俺是农民,就认实实在在看得见的,你那虚幻的太高深,俺不懂。
我是进来拜神的,顺便带点水,很多牛在天上飞,很多仙在空中飘,遮住了阳光,导致小菜无法进行光合作用,再没有水就没法活了。
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
benjiam (xxxx)
天使




UID:59508
注册:2003-5-27
最后登录: 2008-08-29
帖子:1407
精华:0

可用积分:1206 (家境小康)
信誉积分:105
空间积分:0 (白手起家)
专家积分:20 (本版)

状态:...离线...

[个人空间] [短信] [博客]


[推广] 顶部
3楼 发表于 2008-7-3 20:32 
都是正常的,

从来没规定 char* 就一定是只读的。到底将char * 放在那个段里面 由编译器决定.

所以还是养成良好习惯吧。
不要一时的成功养成了错误的观点。



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
Godbach (To be 千里马!)
精灵使


CU奥运火炬传递手2008
UID:534931
注册:2007-3-9
最后登录: 2008-08-29
帖子:3459
精华:4

可用积分:6055 (富足长乐)
信誉积分:105
空间积分:2 (白手起家)
专家积分:1 (本版)

状态:...离线...

[个人空间] [短信] [博客]


[推广] 顶部
4楼 发表于 2008-7-3 20:55 


QUOTE:
原帖由 benjiam 于 2008-7-3 20:32 发表
都是正常的,

从来没规定 char* 就一定是只读的。到底将char * 放在那个段里面 由编译器决定.

所以还是养成良好习惯吧。
不要一时的成功养成了错误的观点。

至少char* fmtstr = "000.000"这个字符串是存储在数据段的。

[ 本帖最后由 Godbach 于 2008-7-3 20:57 编辑 ]



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

明犯我强汉天威者,穷搜天下,万里追杀,覆其巢,断其苗裔,戮其身,追其魂,屠其魄,虽远必诛!
----------------------------------
一尺之槌,日取其半,万世不竭!
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
Godbach (To be 千里马!)
精灵使


CU奥运火炬传递手2008
UID:534931
注册:2007-3-9
最后登录: 2008-08-29
帖子:3459
精华:4

可用积分:6055 (富足长乐)
信誉积分:105
空间积分:2 (白手起家)
专家积分:1 (本版)

状态:...离线...

[个人空间] [短信] [博客]


[推广] 顶部
5楼 发表于 2008-7-3 20:56 


QUOTE:
原帖由 qnnui 于 2008-7-3 20:23 发表
C程序例如:
#include
#include

int main() {
char* fmtstr = "000.000";  // 如果这句改为char fmtstr[]="000.000",是能正常运行的.
char* fmttype = "ZZZ.Z99";

strcpy(fmtstr , fmttype);
p ...

应该就是这样的。当你改成数组的形式的时候,该变量是存在栈上的,然后你将数据段的某个字符串拷贝的栈上,这是可以的。但是反过来应该是不行的。你你把下面变量改成数组,然后再copy,看看是不是依然报错。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

明犯我强汉天威者,穷搜天下,万里追杀,覆其巢,断其苗裔,戮其身,追其魂,屠其魄,虽远必诛!
----------------------------------
一尺之槌,日取其半,万世不竭!
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
lxjlan
新手




UID:220101
注册:2005-1-29
最后登录: 2008-07-03
帖子:6
精华:0

可用积分:17 (白手起家)
信誉积分:100
空间积分:0 (白手起家)
专家积分:0 (本版)

状态:...离线...

[个人空间] [短信] [博客]


[推广] 顶部
6楼 发表于 2008-7-3 21:01 
char* fmtstr = "000.000";  // 如果这句改为char fmtstr[]="000.000",是能正常运行的

这个两个是有明显区别的,前面的这种表达是建立了一个fmtst的字符支付串指针,指向的一个内容为"000.000"的常量字符串的首地址,对于常量是无法更改其数值的。。。。而后种表达是建立了一个字符数组(字符串),是变量,变量的内容是"000.000",并且fmtstr指向了这个字符数组的首地址。。



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
qnnui
侠客




UID:705229
注册:2008-5-14
最后登录: 2008-07-13
帖子:16
精华:1

可用积分:21 (白手起家)
信誉积分:0
空间积分:0 (白手起家)
专家积分:0 (本版)

状态:...离线...

[个人空间] [短信] [博客]


[推广] 顶部
7楼 发表于 2008-7-3 21:11 
6楼你说的意思我知道,我是想问为什么在老系统上能够运行正常呢,是不是和编译器有关,还是和系统有关?



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
qnnui
侠客




UID:705229
注册:2008-5-14
最后登录: 2008-07-13
帖子:16
精华:1

可用积分:21 (白手起家)
信誉积分:0
空间积分:0 (白手起家)
专家积分:0 (本版)

状态:...离线...

[个人空间] [短信] [博客]


[推广] 顶部
8楼 发表于 2008-7-3 21:15 


QUOTE:
原帖由 benjiam 于 2008-7-3 20:32 发表
都是正常的,

从来没规定 char* 就一定是只读的。到底将char * 放在那个段里面 由编译器决定.

所以还是养成良好习惯吧。
不要一时的成功养成了错误的观点。

3楼你说的“到底将char * 放在那个段里面 由编译器决定”,能具体说一下编译器是怎么决定的,或者说在编译时是不是要改那个编译选项呢?



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
benjiam (xxxx)
天使




UID:59508
注册:2003-5-27
最后登录: 2008-08-29
帖子:1407
精华:0

可用积分:1206 (家境小康)
信誉积分:105
空间积分:0 (白手起家)
专家积分:20 (本版)

状态:...离线...

[个人空间] [短信] [博客]


[推广] 顶部
9楼 发表于 2008-7-3 21:18 
由编译器决定.

如果编译器决定在 data段里面 copy 就会成功, 否则就失败。

这和操作系统也有关系的, 如果你在dos 下面测试这个代码 就不会出错,而windowx 下面 或linux都会出错。

至于如何修改 我也不知道,但是建议你还是修改你的代码吧。

至于认为char* 一定是只读的, 那就继续把。



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
qnnui
侠客




UID:705229
注册:2008-5-14
最后登录: 2008-07-13
帖子:16
精华:1

可用积分:21 (白手起家)
信誉积分:0
空间积分:0 (白手起家)
专家积分:0 (本版)

状态:...离线...

[个人空间] [短信] [博客]


[推广] 顶部
10楼 发表于 2008-7-3 21:35 
代码是不良这我明白,但是现在要移植到新系统,这个项目的程序文件太多了,要检查出这种类型的coding不良实在是太困难了,编译时又没有报出警告信息,工作量是相当大呀,所以很系统能知道是否可以设置什么编译器选项来解决这个问题。至少编译时加什么选项如果能报出警告信息也是好事呀。



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘

首页 » 论坛 » C/C++ »


 


Copyright © 2001-2008 ChinaUnix.net All Rights Reserved     联系我们:

感谢所有关心和支持过ChinaUnix的朋友们    转载本站内容请注明原作者名及出处

京ICP证041476号


清除 Cookies - ChinaUnix - Archiver - WAP - TOP

Processed in 0.058572 second(s), 4 queries , Gzip enabled