2012-12-08 41 views
4

可能重复:
Why do I get a segmentation fault when writing to a string?C++:交换实现指向的变量

我有以下程序:

#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

+0

我知道,但我真的很想知道为什么它没有按照我设置的方式工作。顺便提一下,谢谢你的提示。 – tomKPZ

+3

您正在修改字符串文字。 – chris

回答

7

代码对我来说很好。最可能的问题是允许编译器假定字符串文字没有被修改,所以它可以将它们放在只读存储器中。尝试

char s[] = "Hello"; 
main()代替

,其创建字符串的写副本

+0

工作,谢谢!我从来不知道只读内存。 – tomKPZ

0

strlen()的头文件丢失。

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

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

+0

我会+1,但是你说“正确分配”的事实表明,使用堆栈上的本地数组(如我所建议的)某种程度上“不合适”:-P –

+0

事实并非如此。知道我决定什么时候我的数组被解除分配,我只是感到温暖和模糊! :) – Zeenobit