我有一个返回const char*
的函数。
在这个函数中,我有以下参数:
string str;
为了将str转换为const char*
,我使用str.c_str()
。
当我调试时,我注意到str.c_str()
在字符串的值之前包含某些内容(我猜它的地址)。
例如:
如果str =" 0"
我str.c_str()
wiil 0x68d5f9" 0"。
为什么?
我怎样才能得到字符串的值?
答案 0 :(得分:1)
这个不是问题,这就是指针的工作方式。
指针指向某些内存地址中包含的数据,调试器显示此指针指向地址0x<something>
,此地址的值为'0'
。这里没什么奇怪的。
当您从str.c_str()
打印此值时,您将获得一个普通的C字符串。
cout << str.c_str();
这将与cout << str;
答案 1 :(得分:0)
你不会得到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[]
以避免内存泄漏。