例如,为什么不:
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/