奇怪的一段代码

时间:2012-12-07 15:53:34

标签: c++

我写过这个奇怪的代码片段。如何type在其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

3 个答案:

答案 0 :(得分:4)

typedangling pointer,因为它初始化为临时std::string实例的内部成员:

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

获取std::string结果的c_str()实例会立即被破坏。

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

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