在CPP中通过指针传递字符串并获得意外输出

时间:2014-12-20 02:19:04

标签: c++

我尝试了这段代码,我无法理解为什么我得到输出为" HL"而不是" Hl"。 有人请解释一下。

void t(string *s){
    s[1]='l';
}
int main(){
    string s = "HL";
    t(&s);
    cout<<s;
}

2 个答案:

答案 0 :(得分:5)

您现在拥有的是通过将其设置为'l'来更新现有字符串。这是未定义的行为。

这是失败的原因是你将指针索引,好像它指向一个字符串数组(当它实际上指向一个字符串时)。你打算做的是索引实际的字符串以获得它的特征。您必须首先取消引用指针,如下所示:

void t(string *s){
    (*s)[1]='l';
}
int main(){
    string s = "HL";
    t(&s);
    cout<<s;
}

See live on Coliru

如果你实际上正在使用引用,比如建议的标题,你就不需要做任何特殊的语法:

void t(string& s){
    s[1]='l';
}
int main(){
    string s = "HL";
    t(s);
    cout<<s;
}

See live on Coliru

答案 1 :(得分:2)

在函数t中,sstring*,因此s[1]相当于*(s+1)。 ITW,它被视为指向string数组开头的指针,索引为1的元素被设置为"l"。将代码更改为(*s)[1] = 'l';以执行您的操作。