我有一个简单的程序,但我在
*(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++;
}
}
char *str = "Hello World";
是 const 字符串,不能修改。编译器可以随意将其放入不可写位置,从而导致您看到的崩溃。
用
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。
大黑 cokc 大胖黑公鸡 大 blakc 胖 kock