递归反转字符串疑问: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
相关产品推荐
相关产品推荐

