2

我正在尝试编写一个函数来反转字符串,但是当我这样做时遇到了这样的异常: *str++ = *end; 谁知道是什么原因?提前致谢。

void reverse(char* str)
 {
    char *end = str;
    char temp;
    if(str)
    {
      while(*end)
       {
     end++;
       }
    end--;

    while(str<end)
    {
       temp = *str;
       *str++ = *end;
       *end--=temp;
    }
   }
 }
4

2 回答 2

5

很有可能,您使用字符串文字调用了该函数:

 reverse("ablewasiereisawelba");

您不能在不调用未定义行为的情况下修改字符串文字,并且崩溃是对尝试修改字符串文字的有效响应。确保您传递一个非常量数组:

 char palindrome[] = "ablewasiereisawelba";
 reverse(palindrome);

C++ 2011 标准 ISO/IEC 14882:2011 说:

2.14.5 字符串文字 [lex.string]

¶12 尝试修改字符串文字的效果是未定义的。

通常,字符串文字被放置在只读内存中,并且尝试修改一个会导致“崩溃”。这当然是对调用未定义行为的完全合法的回应。

于 2013-02-02T17:33:23.220 回答
0

所以你需要这样做:

 char str[] = "My string to reverse!";

 reverse(str);

这意味着str存储在可修改的内存中。大多数现代编译器都将文字字符串存储在只读内存中(即“引号内的任何内容”,因为您不打算修改原始字符串)。

于 2013-02-02T17:40:23.317 回答