char s[] = "abc";
char t[3] = "abc";
Run Code Online (Sandbox Code Playgroud)
实际上与:
char s[] = { 'a', 'b', 'c', '\0' };
char t[] = { 'a', 'b', 'c' };
Run Code Online (Sandbox Code Playgroud)
以下内容:
char *word = "abc";
word[0] = 'd';
Run Code Online (Sandbox Code Playgroud)
地方word在只读存储器,导致非法内存操作word[0] = 'd'错误.
这只是chars 的情况吗?当我做这样的事情时,我不会得到错误:
int array[] = {1, 2, 3};
int *p = array;
p[0] = 0; // No error here
array[1] = 1; // or here
Run Code Online (Sandbox Code Playgroud)
它仅适用于字符串文字.
字符串文字隐式创建一个类型的数组对象,该对象char[N]包含文字中的字符,后跟一个终止\0'字符.此对象具有静态存储持续时间,并且是只读的.(const由于历史原因,它不是,但尝试修改它有不确定的行为.)
当你写:
char *ptr = "abc";
Run Code Online (Sandbox Code Playgroud)
您正在创建ptr指针对象,并将其初始化为指向包含的只读静态数组"abc".(您可以通过将其定义为阻止尝试修改它const.)
当你写:
char arr[] = "abc";
Run Code Online (Sandbox Code Playgroud)
要创建arr一个数组对象,类型char[4],以及复制静态只读数组的内容到该对象.arr不是只读的.
int array[] = {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)
创建一个数组对象并如图所示初始化它.没有"整数数组文字"就像字符串文字一样.(几乎有 - 看到"复合文字" - 但那些没有与字符串文字相同的只读语义.)
请注意:
char t[3] = "abc";
Run Code Online (Sandbox Code Playgroud)
是一种特殊情况:如果使用字符串文字初始化数组,并且没有终止空间'\0',则只将非空字符复制到数组中.因此,t不包含字符串,只包含未终止的字符序列.这与您的问题无关.