请教:有关AnsiString.c_str()函数的问题。

blueyoyoy 2004-12-31 11:17:38
rt.
1)AnsiString.c_str()与c++标准库中的string::c_str()是不是有区别?前者返回的是指向非const类型字符串的指针,后者返回的是指向const类型的指针?这样理解对吗?
2)const类型的变量是不能修改的,但是如下语句:
char *str = "hello"; //按照C++规则,str指向的应该是一常量字符串
str = "123"; //没问题,str指向另一块内存
str[0] = '1'; //这一段应该有问题的,但是编译和运行时都没有报错
难道CB里面char *str = "hello"; str并不是指向常量字符串?一定要显示定义const char *str = "hello"吗?
3) 函数如下:
char* test(String &str)
{
char *ch;
//对str的处理
ch = str.c_str();
return ch;
}
程序中调用:
String str = "hello";
char *time;
time = test(str);
怎么看怎么觉得这样传递指针有错,但运行结果并没有错误?ch = str.c_str();返回的应该是一指向“栈内存”的指针,为什么运行没问题呢?上面的程序应该怎么改比较合理?
...全文
320 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
有哥 2004-12-31
  • 打赏
  • 举报
回复
楼主提供的程序在BCB下是通不过编译的
hswu 2004-12-31
  • 打赏
  • 举报
回复
1)AnsiString.c_str()与c++标准库中的string::c_str()是不是有区别?前者返回的是指向非const类型字符串的指针,后者返回的是指向const类型的指针?这样理解对吗?
他们都是为了配合C中char*的使用而推出的指针返回(大量的API都使用char*的参数),该指针可被用于其它需要引用指针的用法中,手上电脑没有BCB,所以无法回答你他们是否都返回const的指针,但不管是否都是返回const指针,你都应该当const来用,因为AnsiString 与std::string都是动态申请内存,不管你是修改了指针还是写指针指向的内存都是危险的操作,都应该谨慎从之,你应该只使用c_str()返回的指针进行只读操作.如果真的要写内存,请保证先使用setlength之类的函数预分配足够的内存,以免内存越界...


2)const类型的变量是不能修改的,但是如下语句:

char *str = "hello"; //OK

str = "123"; //这段应该有问题,对于指针不允许直接如此赋值,但编绎器不同会有所差异,该语句不报错应该为隐式转换str=&("123");

str[0] = '1'; //ok, 这句没有问题,只是替换内存第一个字节内容现在的str = "1ello"

难道CB里面char *str = "hello"; str并不是指向常量字符串?一定要显示定义const char *str = "hello"吗?
不错,该处你确实应该明文定义const,BCB此处并不做隐式检查.

3) 函数如下:
char* test(String &str)
{
char *ch;
//对str的处理
ch = str.c_str();
return ch;
}
程序中调用:
String str = "hello";
char *time;
time = test(str);
怎么看怎么觉得这样传递指针有错,但运行结果并没有错误?ch = str.c_str();返回的应该是一指向“栈内存”的指针,为什么运行没问题呢?上面的程序应该怎么改比较合理?

上述语句当然没有错,ch返回了一个指针,该指针指向有效的内存地址str.c_str()中,ch虽然被释放,但其指向内存却仍旧存在,其指针值被正确的返回time,所以time指向正确的str,当然无错.
同时,string并不是在栈中分配内存,同时就算是你改string为int之类的,其虽然在栈中分配内存,但其作用域仍旧有效,仍然不会早与ch释放,而是与time一起释放,你认真想一下就明白了:)
Lonelywolf1899 2004-12-31
  • 打赏
  • 举报
回复
楼猪没有分清楚:

指向常量的指针变量

指向变量的指针常量
bcb_alone 2004-12-31
  • 打赏
  • 举报
回复

此时返回的是另一在函数中定义的字符串,那么str1所拥有的内存在函数调用完之后应该会被释放,因此不能保证ch所指向的内容的正确性。
这样理解对吗?

对。如果有另外的变量占用了那段内存。
那么就可能改变它的内容。
blueyoyoy 2004-12-31
  • 打赏
  • 举报
回复
To hswu(hswu) :
谢谢你的回答。还有一个疑问。我如果把函数改成这样
3) 函数如下:
char* test(String &str)
{
char *ch;
//对str的处理
String str1;
str1 = "hhhh";
ch = str1.c_str();
return ch;
}
程序中调用:
String str = "hello";
char *time;
time = test(str);

此时返回的是另一在函数中定义的字符串,那么str1所拥有的内存在函数调用完之后应该会被释放,因此不能保证ch所指向的内容的正确性。
这样理解对吗?

pangdu 2004-12-31
  • 打赏
  • 举报
回复
楼上正解,学习。
hswu 2004-12-31
  • 打赏
  • 举报
回复
To:blueyoyoy()
char *str = "hello"; 如果说str指向的是常量字符串,那为什么可以修改str [0]的值?

不错,"hello"是常量字符串,但也是放在内存中,所以我们仍然可以更改他,你们认为不能更改是因为编绎器本应对此做出限制,并报编绎异常,但BCB并没有对此做出隐式处理,所以你应该显式指定const char *str = "hello"

这样的解释,能明白不?理解这些将会对你以后的编程带来无数的好处,建议楼主不要怕晕,再认真看一下与更更理解一下,这真的很重要!!

我很少一个问题回来两次,只是希望明白这个的重要性!!

good luck
blueyoyoy 2004-12-31
  • 打赏
  • 举报
回复
看了半天还是晕,不管了,我想以后只要遇到返回char *的情况,都先new一块内存,再采用strcpy将值拷贝过去,主程序理记得delete一下,这样应该不会有什么问题了吧。有关字符串的问题真是烦。
blueyoyoy 2004-12-31
  • 打赏
  • 举报
回复
To:JedyWoody(学,然后知不足)
char *str = "hello"; 如果说str指向的是常量字符串,那为什么可以修改str [0]的值?
blueyoyoy 2004-12-31
  • 打赏
  • 举报
回复
可以通过编译的啊。
JedyWoody 2004-12-31
  • 打赏
  • 举报
回复
怎么看怎么觉得这样传递指针有错,但运行结果并没有错误?ch = str.c_str();返回的应该是一指向“栈内存”的指针,为什么运行没问题呢?上面的程序应该怎么改比较合理?
返回的不是指向“栈内存”的指针,是指向调用函数中指定的"hello"的指针
JedyWoody 2004-12-31
  • 打赏
  • 举报
回复
难道CB里面char *str = "hello"; str并不是指向常量字符串?一定要显示定义const char *str = "hello"吗?
str指向的是常量字符串

JedyWoody 2004-12-31
  • 打赏
  • 举报
回复
str[0] = '1'; // 在c和c++中都是正确的,取的是str = "123"; 中的1

13,873

社区成员

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

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