Memory management 如何解决访问冲突写入位置错误?

Memory management 如何解决访问冲突写入位置错误?,memory-management,access-violation,Memory Management,Access Violation,我有一个简单的程序,我在*(str+start)上遇到访问冲突。为什么?我应该可以改变它。对吧? void fn() { char *str = "Hello wordl!"; int end = strlen(str); int start = 0; end--; while(start < end) { *(str + start) = *(str + end); <--- Access violat

我有一个简单的程序,我在
*(str+start)
上遇到访问冲突。为什么?我应该可以改变它。对吧?

void fn()
{
     char *str = "Hello wordl!";
     int end = strlen(str);
     int start = 0;
     end--;
     while(start < end)
     {
         *(str + start) = *(str + end);  <--- Access violation writing location *(str + Start).
         end--;
         start++;
     }
}
void fn()
{
char*str=“你好,wordl!”;
int end=strlen(str);
int start=0;
结束--;
while(开始<结束)
{

*(STR+START)=*(STR+EDGE);“Pr>不”,“Hello World”是一个常量字符串文字,需要在C或C++中分配内存,如果你想要内存,可以自由修改。

< P>这是因为你正在写一个字符串文本存储,它可能在内存的保护区。

<代码>代码> char * STR =“Hello World”;
是一个常量字符串,不能修改。编译器可以随意将其放入不可写的位置,从而导致您看到的崩溃


将声明替换为
char str[]=“Hello World”;
应该做你想做的事,将字符串放入堆栈上可修改的数组。

正如其他人所指出的,文本字符串可能存储在内存的只读区域。你是否在编译时打开了警告?你应该得到一个关于丢弃字符串文本常量的警告

你可以做的是:

char *str = strdup("Hello, world!");
// Modify the string however you want
free(str);

在您的示例中,Hello wordl!是常量字符串,任何修改此常量字符串的尝试都将导致异常。 相反,你可以这样做-

string s = "Hello wordl!";
char* ptr = &s[0];

然后使用ptr。

char str[]与char*str的对比会导致字符串可修改。以下是对该字符串的一些引用: