You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 11:15:36