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

时间:2009-03-16 21:07:09

标签: 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 violation writing location *(str + Start).
         end--;
         start++;
     }
}

5 个答案:

答案 0 :(得分:25)

char *str = "Hello World";是一个const字符串,无法修改。编译器可以自由地将它放入一个不可写的位置,导致你看到崩溃。

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

答案 1 :(得分:4)

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

答案 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。