这有什么区别:
char arr[] = "Hello, world!";
Run Code Online (Sandbox Code Playgroud)
还有这个:
char *arr = "Hello, world!";
Run Code Online (Sandbox Code Playgroud)
两个字符串的内存在哪里分配?为什么我无法更改后一个字符串的内容?
第一个是专门为其分配的可写内存arr,它是一个chars 数组.您可以在不调用未定义行为的情况下修改它.这是完全合法的:
char arr[] = "Hello, world!";
arr[1] = 'i';
Run Code Online (Sandbox Code Playgroud)
第二个是指向只读字符串的指针.因此,这是未定义的行为:
char *parr = "Hello, world!";
parr[1] = 'i'; // Cannot write to read-only memory!
Run Code Online (Sandbox Code Playgroud)
在一些编译器实现中:
char *a = "Hello, world!";
char *b = "Hello, world!";
a[1] = 'i';
// b[1] == 'i';
Run Code Online (Sandbox Code Playgroud)
这不能得到保证 - 我只是将它包含在内,为您提供"直观"的感觉,说明为什么它是未定义的行为.