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

标签 c syntax

我已经看到(12):

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/

相关文章:

c - 求阶乘时出现段错误

c - 为什么 'u0' = 30000 在 C 中?

C 动态 3D 阵列存储器

MySQL 语法。表名、点、字段名之间可以使用空格吗?

C::在函数中转换指针会丢失数据吗?

c程序问题

c - libxml2 - xpath 和更新属性

ios - 枚举大小写的 Swift typealias

syntax - VHDL - 在计算通用参数后调整端口大小

c++ - 在 C++ 中初始化结构的语法是什么?