访问违规写入位置?

时间:2013-02-02 17:31:19

标签: c++

我正在尝试编写一个函数来反转字符串,但是当我这样做时我得到了这样的异常:* 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;
    }
   }
 }

2 个答案:

答案 0 :(得分:5)

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

 reverse("ablewasiereisawelba");

如果不调用未定义的行为,则无法修改字符串文字,而崩溃是对尝试修改字符串文字的有效响应。确保传递非常量数组:

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

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

  

2.14.5字符串文字[lex.string]

     

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

通常,字符串文字放在只读内存中,尝试修改字符串文字会导致“崩溃”。这肯定是对调用未定义行为的完全合理的回应。

答案 1 :(得分:0)

所以你需要这样做:

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

 reverse(str);

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