我有一个简单的程序,我在*(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++;
}
}
答案 0 :(得分:25)
char *str = "Hello World";
是一个const字符串,无法修改。编译器可以自由地将它放入一个不可写的位置,导致你看到崩溃。
用char str[] = "Hello World";
替换声明应该做你想要的,将字符串放入堆栈中的可修改数组。
答案 1 :(得分:4)
答案 2 :(得分:3)
正如其他人所指出的,文字字符串可以存储在内存的只读区域中。您是否在打开警告的情况下进行编译?您应该收到关于丢弃字符串文字的常量的警告。
你能做的是:
char *str = strdup("Hello, world!");
// Modify the string however you want
free(str);
答案 3 :(得分:2)
这是因为你正在写一个字符串文字的存储,它可能存在于受保护的内存区域。
答案 4 :(得分:0)
在您的示例中,您好!是常量字符串,任何尝试修改此常量字符串的操作都会导致异常。 相反,您可以执行此操作-
string s = "Hello wordl!";
char* ptr = &s[0];
然后试玩ptr。