在C中,char*s和char s []之间的区别是否适用于其他类型?

awa*_*lll 3 c syntax

我已经发现(1,2)的是:

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)

Kei*_*son 7

它仅适用于字符串文字.

字符串文字隐式创建一个类型的数组对象,该对象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不包含字符串,只包含未终止的字符序列.这与您的问题无关.