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

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

这有什么区别:

char arr[] = "Hello, world!"; 

还有这个:

 char *arr = "Hello, world!"; 

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

第一个是专门为arr分配的可写内存,它是一个char数组。 您可以在不调用未定义行为的情况下修改它。 这是完全合法的:

 char arr[] = "Hello, world!"; arr[1] = 'i'; 

第二个是指向只读字符串的指针。 因此,这是未定义的行为

 char *parr = "Hello, world!"; parr[1] = 'i'; // Cannot write to read-only memory! 

一些编译器实现中:

 char *a = "Hello, world!"; char *b = "Hello, world!"; a[1] = 'i'; // b[1] == 'i'; 

这不能得到保证 – 我只是将它包含在内,让您直观地了解为什么它是未定义的行为。