1

我写了这段奇怪的小代码。这怎么可能type在它的 2 之间发生变化printf

提前致谢

int main()
{
    string label = string("faults_team_A_player_12");

    size_t f = label.find('_');

    const char *type = label.substr(0,f).c_str();
    const char team = label.at(f+sizeof("team_"));

    printf("type = %s\n",type);

    int n;
    size_t l = label.length()-label.find_last_of('_');

    int x = sscanf((char *)label.substr(label.find_last_of('_'),l).c_str(),"_%d",&n);
    printf("type = %s\n",type);
    printf("team = %c\n",team);
    printf("player = %d\n",n);

    return 0;
}

输出:

type = faults
type = _12
team = A
player = 12
4

3 回答 3

4

type是一个悬空指针,因为它被初始化为一个临时std::string实例的内部成员:

const char *type = label.substr(0,f).c_str();

std::string从中获取结果的实例会c_str()立即被销毁。

于 2012-12-07T15:55:26.320 回答
3
const char *type = label.substr(0,f).c_str();

指针指向临时 ( )type中的一段数据。label.substr(0,f)对该指针的任何使用都是未定义的行为。

于 2012-12-07T15:55:29.793 回答
0

std::string当您通过调用获得指向's 缓冲区的指针时,.c_str()您不会获取缓冲区。例如,当字符串对象超出范围时,指针就会失效。

于 2012-12-07T15:56:23.590 回答