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

递归反转字符串疑问:string指针str+1为何无法指向首元素后位置?

问题解答:string指针与数组指针的偏移差异
  • 指针指向的类型决定偏移逻辑
    你混淆了两种完全不同的指针类型:

    • 数组名(比如char arr[] = "abc")退化为指针时,是char*类型,指向数组的第一个字符。arr+1会按char的大小(通常1字节)偏移,指向数组的第二个字符。
    • 你的代码中string* str是指向整个std::string对象的指针,而非指向string内部字符的指针。str+1会按std::string对象的完整大小(通常包含字符指针、长度、容量等成员,远大于1字节)偏移,指向内存中当前string对象之后的下一个string对象位置,这完全不是你想要的“第一个索引对应的位置”。
  • 代码的核心错误
    递归调用rec_rev_str(str+1, size-1)时,你实际上每次都在跳转到下一个string对象的地址,而非当前string内部的下一个字符,这会导致访问非法内存,属于未定义行为。

  • 修正后的实现方案
    若要操作string内部的字符,需传递char*类型的指针(指向string的第一个字符),而非string*。调整后的代码示例:

    void rec_rev_str(char *str, int size) {
        if (size <= 0) {
            return;
        }
        swap(str[0], str[size]);
        // char*指针+1,指向当前字符的下一个位置,同时缩小首尾范围(size减2)
        rec_rev_str(str + 1, size - 2);
    }
    
    int main() {
        string str = "great";
        // 获取指向string内部第一个字符的char*指针
        rec_rev_str(&str[0], str.size() - 1);
        cout << str << endl;
    }
    

内容的提问来源于stack exchange,提问作者Shashank Tripathi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 05:25:42