-3

我有一个返回的函数const char*。在这个函数中,我有以下参数:

string str;

为了将 str 转换为const char*我使用str.c_str().

当我调试时,我注意到str.c_str()在字符串值之前包含一些东西(我猜是它的地址)。例如:如果 str="0" 我str.c_str()将 0x68d5f9 "0"。为什么?如何仅获取字符串的值?

4

2 回答 2

1

不是问题,这就是指针的工作方式。

指针指向某个内存地址中包含的数据,调试器会向您显示该指针指向地址0x<something>,并且该地址处的值为'0'. 这里没有什么奇怪的。

当您打印从 获得的这个值时str.c_str(),您将得到一个普通的 C 字符串。

cout << str.c_str();

这会给你同样的cout << str;

于 2016-04-03T11:36:07.157 回答
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[]结果以避免内存泄漏。

于 2016-04-03T11:34:25.287 回答