可能重复:
Why do I get a segmentation fault when writing to a string?
我有以下程序:
#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的指向值,但似乎有些东西被搞砸了。在此先感谢您的帮助!
答案 0 :(得分:7)
代码看起来很好。最可能的问题是允许编译器假定字符串文字未被修改,因此它可以将它们放在只读内存中。尝试
char s[] = "Hello";
在main()
中,它会创建字符串文字的可写副本。
答案 1 :(得分: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>
标头才能访问strcpy
和strlen
。
答案 2 :(得分:0)
缺少strlen()的头文件。
其次,它会抛出一个警告 - 从字符串常量到char *的过时转换,@ j_random_hacker的解决方案似乎解决了这个问题。