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的对比会导致字符串可修改。以下是对该字符串的一些引用: