char s[] = "abc";
char t[3] = "abc";
实际上等同于:
char s[] = { 'a', 'b', 'c', '\0' };
char t[] = { 'a', 'b', 'c' };
以及以下内容:
char *word = "abc";
word[0] = 'd';
将word
放入只读内存,导致非法内存操作word[0] = 'd'
出错。
只有 char
才会出现这种情况吗?当我做这样的事情时,我不会得到错误:
int array[] = {1, 2, 3};
int *p = array;
p[0] = 0; // No error here
array[1] = 1; // or here
最佳答案
它仅适用于字符串文字。
字符串文字隐式地创建一个 char[N]
类型的数组对象,其中包含文字中的字符,后跟终止符 \0'
。该对象具有静态存储期限并且是只读的。 (由于历史原因,它不是 const
,但尝试修改它会产生未定义的行为。)
当你写的时候:
char *ptr = "abc";
您正在将 ptr
创建为指针对象,并将其初始化为指向包含 "abc"
的只读静态数组。 (您可以通过将其定义为 const
来防止修改它的尝试。)
当你写的时候:
char arr[] = "abc";
您正在将 arr
创建为 char[4]
类型的数组对象,并复制静态读取的内容-仅数组到该对象中。 arr
不是只读的。
int array[] = {1, 2, 3};
创建一个数组对象并初始化它,如图所示。没有像字符串文字那样的“整数数组文字”。 (几乎 是——参见“复合文字”——但它们不具有与字符串文字相同的只读语义。)
请注意:
char t[3] = "abc";
是一种特殊情况:如果数组是用字符串文字初始化的,并且没有空间用于终止 '\0'
,则只有非空字符会被复制到大批。因此,t
不包含字符串,只是一个未终止的字符序列。这与您的问题不是特别相关。
关于c - 在 C 中,char *s 和 char s[] 之间的区别是否适用于其他类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41371628/