写入位置的访问冲突

Access violation writing location?

本文关键字:访问冲突 位置      更新时间:2023-10-16

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

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

 reverse("ablewasiereisawelba");

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

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

C++2011标准ISO/IEC 14882:2011规定:

2.14.5字符串文字[lex.String]

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

通常,字符串文字被放在只读内存中,试图修改文字会导致"崩溃"。这无疑是对援引未定义行为的完全合理的回应。

所以你需要这样做:

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

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