数组和指针创建的字符串之间的区别?

tea*_*her 4 c string

可能重复:
C中的char s []和char*s有什么区别?

这有什么区别:

char arr[] = "Hello, world!";
Run Code Online (Sandbox Code Playgroud)

还有这个:

char *arr = "Hello, world!";
Run Code Online (Sandbox Code Playgroud)

两个字符串的内存在哪里分配?为什么我无法更改后一个字符串的内容?

Mat*_*haq 5

第一个是专门为其分配的可写内存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)

这不能得到保证 - 我只是将它包含在内,为您提供"直观"的感觉,说明为什么它是未定义的行为.