我好象发现了BCB6的一个BUG

khalidwind 2004-09-17 03:18:54
两个Edit,Edit1和Edit2
现在我想让Edit2显示Edit1的内容,而且先将Edit1的Text转换成char*字符串.
char *s = Edit1->Text.c_str();
Edit2->Text = s;
如果Edit1的内容最后一个字符是数字,比如Edit1的Text内容是"Edit1"
执行这个程序大家看看,会发现Edit2里显示"Edit",而"1"丢掉了.
于是我又定义了一个String字符串先将Edit1的内容保存下来
char *s = Edit1->Text.c_str();
String ss = s;
Edit2->Text = ss;
结果一样,我单步执行发现在将ss赋值的时候s就变了.我怀疑是String类的拷贝构造函数有个BUG.
大家试一试?
...全文
437 48 打赏 收藏 转发到动态 举报
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
toney2002 2004-09-24
  • 打赏
  • 举报
回复
mark...
COpyFRee 2004-09-24
  • 打赏
  • 举报
回复
进来之前就猜对了,果然又是这个问题!
cnrealboy 2004-09-24
  • 打赏
  • 举报
回复
虽然用了bcb好几年,但是今天还是张了见识,澄清了一些比较模糊的想法。
zly1980 2004-09-23
  • 打赏
  • 举报
回复
SB,AnsiString 类的.c_str()根本不能给 char *变量数值.这样是可以的:
char Tmp[1024];
memset(Tmp,0,sizeof(Tmp));
strcpy(&Tmp[0],AnsiString.c_str());
&Tmp[0]就是你要的 char*类型.连基本的C都不懂还发现BUG.
VB的左值右值有点XX.
clong320 2004-09-23
  • 打赏
  • 举报
回复
ccrun(老妖)说得对,"不要把String的.c_str()直接赋给一个char* 最好用strcpy函数".因为String的.c_str()得到的是一个指向String中字符内容的地址,因此它是不能直接用赋值的方法来处理的。
jixiaoqiang 2004-09-22
  • 打赏
  • 举报
回复
我的原意是我必须得用一个跟aa相似的函数,该函数需要对传过来的字符指针向后添加字符,我在调用该函数前怎样声明一个变量,当在aa函数里面对他操作时,该变量的长度会自动改变?能实现否?

我目前的做法是申请一个足够大的字符数组,把首指针传给他。但这样定死总觉得不灵活.
jixiaoqiang 2004-09-22
  • 打赏
  • 举报
回复
这种动作会不会很危险,aa函数中假如一直对原来的str增加字符,原来声明str的时候分配的内存够不够?会不会把其他地址的内容也给改了?

jixiaoqiang 2004-09-22
  • 打赏
  • 举报
回复
我也碰到过这个问题,跟这个应该很相似,大家解释解释;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString str;
aa(str.c_str());
ShowMessage(str); //调用之后str的内容是空的
ShowMessage(AnsiString(str.c_str())); //而这个内容不是空的.
}

void __fastcall TForm1::aa(char * pStr)
{
*pStr='1';
pStr++;
*pStr='2';
pStr++;
*pStr='3';
}
真如实观 2004-09-19
  • 打赏
  • 举报
回复
回复人: xpdavis(咕嘟) ( ) 信誉:100 2004-09-18 13:04:00 得分: 0
其实很简单Edit1->Text是临时的,c_str()返回的指针并不是临时的。

倒是想听听高见,如何解释这句话?
/////////////////////////////////////
对!如何解释这句话?
eccalc 2004-09-19
  • 打赏
  • 举报
回复
虚心学习中...
Maconel 2004-09-18
  • 打赏
  • 举报
回复
大M到此一游
真如实观 2004-09-18
  • 打赏
  • 举报
回复
不关“AnsiString的生存期”的事,应该是存贮地址的问题。
AnsiString::c_str() returns a non const temporary pointer to the internal string buffer in the AnsiString object.
JetKingLau 2004-09-18
  • 打赏
  • 举报
回复
这个贴子我最有发言权,因为偶在以前曾经把N多c_str()的贴子顶翻了天,自以为从此大家都知道了,没想到今天又出现了.
///////////

“全编译”的问题很多人都顶翻天了,但少则 3 天,多则一周,又来了!!!
zjqyb 2004-09-18
  • 打赏
  • 举报
回复
有的时候c_str()还是有用确有效率,但是必须自己头脑清楚!!!
myy 2004-09-18
  • 打赏
  • 举报
回复
to tanlim(求学者):

你说的确实不对,决定保存的c_str()值是否还有效,不是“AnsiString的生存期”,
是“AnsiString内部的存贮区”是否重新分配过,AnsiString的内容被改变,极有
可能导致重新分配。
558047 2004-09-18
  • 打赏
  • 举报
回复
希望这种火爆高级的讨论场面在我们的论坛常在
binbin 2004-09-18
  • 打赏
  • 举报
回复
回复人: xpdavis(咕嘟) ( ) 信誉:100 2004-09-18 13:04:00 得分: 0
其实很简单Edit1->Text是临时的,c_str()返回的指针并不是临时的。

倒是想听听高见,如何解释这句话?

558047 2004-09-18
  • 打赏
  • 举报
回复
记笔记,这么多老大来上课
Persistent8813 2004-09-18
  • 打赏
  • 举报
回复
听课
binbin 2004-09-18
  • 打赏
  • 举报
回复
楼上:
变量生存期内这样的赋值是没有问题的

这句话是错误的,在AnsiString的生存期时指针仍然可能会无效,在AnsiString对象生存期内只要你改变了值的内容,该对象内部存贮区就可能被释放重新分配,原有指针就会无效.
加载更多回复(28)

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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