我有一个返回的函数const char*
。在这个函数中,我有以下参数:
string str;
为了将 str 转换为const char*
我使用str.c_str()
.
当我调试时,我注意到str.c_str()
在字符串值之前包含一些东西(我猜是它的地址)。例如:如果 str="0" 我str.c_str()
将 0x68d5f9 "0"。为什么?如何仅获取字符串的值?
这不是问题,这就是指针的工作方式。
指针指向某个内存地址中包含的数据,调试器会向您显示该指针指向地址0x<something>
,并且该地址处的值为'0'
. 这里没有什么奇怪的。
当您打印从 获得的这个值时str.c_str()
,您将得到一个普通的 C 字符串。
cout << str.c_str();
这会给你同样的cout << str;
你不会得到由返回的字符串中的指针所指向的地址c_str
。它是一个调试器工件,旨在让程序员检查地址和值。
但是,c_str
如果在函数范围的字符串上进行调用,则返回的结果可能是未定义的行为。
例如,这是非法的:
const char *illegal_return() {
string s = "quick brown fox";
return s.c_str(); // <<== Return of c_str from a local string
}
最好的解决方法是返回一个string
. 如果你想返回一个char
指针,你需要制作一个副本:
char *legal_return() {
string s = "quick brown fox";
const char *ptr = s.c_str();
size_t len = strlen(ptr);
char *res = new char[len+1];
strcpy(res, ptr);
return res;
}
上述函数的调用者必须调用delete[]
结果以避免内存泄漏。