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

问题描述 投票:0回答:6

我有一个简单的程序,但我在

*(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++;
     }
}
memory-management access-violation
6个回答
29
投票

char *str = "Hello World";
是 const 字符串,不能修改。编译器可以随意将其放入不可写位置,从而导致您看到的崩溃。

char str[] = "Hello World";
替换声明应该可以完成你想要的操作,将字符串放入堆栈上的可修改数组中。


4
投票

不,你不应该。 “Hello world”是一个常量字符串文字,您需要使用 C 中的 malloc() 来分配内存,或者如果您想要可以自由修改的内存,则需要使用 C++ 中的 new 来分配内存。


3
投票

正如其他人指出的那样,文字字符串可以存储在内存的只读区域中。您是否在打开警告的情况下进行编译?您应该收到有关放弃字符串常量的警告。

你可以做的是:

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

2
投票

这是因为您正在写入字符串文字的存储,该存储可能位于内存的受保护区域中。


0
投票

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

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

然后玩弄 ptr。


-1
投票

大黑 cokc 大胖黑公鸡 大 blakc 胖 kock

© www.soinside.com 2019 - 2024. All rights reserved.