c - 为什么用 'const' 声明 C 中的字符串?

标签 c string pointers constants

例如,为什么不:

char *s= "example";

代替:

const char *s= "example";

我知道 const 使它不可更改,但为什么我在第一次编译时收到错误消息?

此外,这个概念如何应用于

int * x;

对比

const int *x;

我看到第二个使用得更多,使用“cons int *”是好的做法吗?

最佳答案

没有要求使用 const,但这是个好主意。

在 C 中,字符串字面量是 char[N] 类型的表达式,其中 N 是字符串的长度加 1(对于终止 '\0' 空字符)。但是尝试修改与字符串文字对应的数组具有未定义的行为。许多编译器将该数组存储在只读内存中(不是物理 ROM,而是操作系统标记为只读的内存)。 (在大多数上下文中,数组表达式被转换为引用数组对象初始元素的指针表达式。)

将字符串文字设为 const 会更有意义,但 const 关键字在旧版本的 C 中不存在,并且它会破坏现有代码。 (C++ 确实使字符串文字 const)。

这个:

char *s= "example"; /* not recommended */

实际上在 C 中是完全有效的,但它有潜在的危险。如果在此声明之后,您执行以下操作:

s[0] = 'E';

那么您正在尝试修改字符串文字,而行为是未定义的。

这个:

const char *s= "example"; /* recommended */

也是有效的;评估字符串文字得到的 char* 值被安全、安静地转换为 const char*。而且它通常比第一个版本更好,因为如果您尝试修改字符串文字,它会让编译器警告您(在编译时捕获错误比在运行时捕获错误更好)。

如果您在第一个示例中遇到错误,那么很可能是您无意中将代码编译为 C++ 而不是 C —— 或者您正在使用 gcc 的 -Wwrite-strings选项或类似的东西。 (-Wwrite-strings 使字符串文字成为 const;它可以提高安全性,但也可能导致 gcc 拒绝有效的 C 代码,或者至少发出警告。)

关于c - 为什么用 'const' 声明 C 中的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39968298/

相关文章:

根据用户输入创建可变数量的字符串变量(C语言)

c - 下面的代码段的作用是什么?

c - 在C中读取字符网格

c - 寻找字谜

java - 什么会导致这个特定的回文出现逻辑错误

c - C 中奇怪的结构体数组打印错误

c - 在连接失败时重用套接字描述符

在 C 中从对数转换为线性并取平均值

string - 如何获取字符的 Unicode 值?

c++ - 无法理解它是如何工作的?