12

我有一个简单的程序,但在*(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++;
     }
}
4

5 回答 5

28

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

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

于 2009-03-16T21:18:56.597 回答
4

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

于 2009-03-16T21:10:53.700 回答
3

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

你可以做的是:

char *str = strdup("Hello, world!");
// Modify the string however you want
free(str);
于 2009-03-17T01:59:19.433 回答
2

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

于 2009-03-16T21:11:53.090 回答
0

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

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

然后玩ptr。

于 2018-08-21T09:47:00.683 回答