C++中使用string指针访问元素报错问题咨询
string指针访问错误:原因与修复方案
问题原因
你写的代码里,string *sh = &s;是指向单个string对象的指针,并非指向string数组的指针。sh[2]等价于*(sh + 2),这会尝试访问内存中s之后第2个string对象的位置,但这里只存在s一个string对象,属于数组越界访问,触发了未定义行为,所以程序报错。而s[2]是正确的,它访问的是s字符串里的第三个字符(索引从0开始)。
解决方案
根据不同需求,有三种修复方式:
需求1:通过指针访问原string对象里的字符
直接解引用指针拿到原string对象,再访问字符:
int main() { string s="abcde"; string *sh=&s; cout<<(*sh)[2]<<" "<<s[2]<<endl; // 输出 c c }
(*sh)获取指针指向的s对象,(*sh)[2]和s[2]效果完全一致。
需求2:直接操作字符串的字符指针
如果想直接指向字符串的字符数组,可以这样写:
int main() { string s="abcde"; const char *sh = s.c_str(); // 用s.data()也可以,c_str()返回const指针更安全 cout<<sh[2]<<" "<<s[2]<<endl; // 输出 c c }
这种方式直接拿到字符串内部字符数组的首地址,sh[2]就是第三个字符。
需求3:操作string数组的指针
如果你的本意是用指针处理string数组,先定义数组再操作:
int main() { string arr[] = {"abcde", "fghij", "klmno"}; string *sh = arr; cout<<sh[2]<<" "<<arr[2]<<endl; // 输出 klmno klmno }
这里sh指向数组首元素,sh[2]就是数组的第三个string对象。
内容的提问来源于stack exchange,提问作者Roshhe
相关产品推荐
相关产品推荐

