C++:交换指向变量的指针

4

可能是重复问题:
为什么在写字符串时我会收到分段错误?

我有以下程序:

#include <iostream>
using namespace std;

void reverseString(char* first, char* last)
{
    while(first < last)
    {
        cout << *first << " " << *last << endl; //for debugging; prints 'H' and 'o' then crashes
        char temp = *last;
        *last = *first; //this line crashes the program
        *first = temp;
        first++;
        last--;
    }
}

int main()
{
    char* s = "Hello";
    reverseString(s, s + strlen(s) - 1);
    cout << s << endl;
}

然而,我在交换指针所指向的值时遇到了麻烦。我认为*p = *p1应该只是将p所指向的值设置为p1所指向的值,但似乎出现了一些问题。感谢您提前提供任何帮助!


3
如果您不需要自己实现,建议使用 std::reverse - chris
我知道,但我真的很想知道为什么它没有按照我设置的方式工作。顺便说一句,谢谢你的提示。 - tomKPZ
3
你正在修改一个字符串文字。 - chris
3个回答

7

我觉得代码没问题。最可能的问题是编译器会默认字符串字面值不会被修改,因此可以将它们放在只读内存中。您可以尝试

char s[] = "Hello";

而是在main()中创建一个字符串字面值的可写副本


好的,谢谢!我从来不知道只读存储器。 - tomKPZ

1
一个替代方案给 @j_random_hacker:
char* buffer = new char[32];
strcpy(buffer, "Hello");
reverseString(buffer, buffer + strlen(buffer) - 1);

... rest of your program ...

delete[] buffer;

这段代码为C风格的字符串正确分配内存,使其可以被任何函数修改。当然,你需要包含<string.h>头文件才能访问strcpystrlen函数。


我会点赞,但是你说“正确分配”暗示着在栈上使用本地数组(就像我提出的那样)是不合适的 :-P - j_random_hacker
这并不是。我只是感觉到非常温暖和舒适,因为我可以决定何时释放我的数组! :) - Zeenobit

0

strlen()的头文件丢失。

其次,它会抛出警告 - 从字符串常量到char *的转换已被弃用,@j_random_hacker的解决方案似乎解决了这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接