字符串在 C 编程语言中被称为常量。
所以,当我给出char *s = "Hello"
之类的语句时,我已经知道s
指向 H 的内存位置,因为“Hello”存储在某些静态内存中该程序以及"Hello"
也是不可变的。
这是否意味着变量s
现在是指向常量数据的类型的变量,例如const int a = 3;const int *i = &a;
。这似乎是因为我无法操纵数据(当我这样做时,会导致分段错误)。
但是,如果是这样,编译器是否应该能够检测并说我已将合格数据分配给非限定变量。
像char *p
p这样的东西是指向非限定字符的指针,当我说char *p="Hello"
p时,指向非限定字符的指针不能指向const字符类型< / em>的
我在这里缺少什么?
如果不是如上所述,那么常量字符数组如何变为不可变?
答案 0 :(得分:4)
首先,C中的字符串不是不可变的。 C甚至不知道字符串的类型 - 字符串只是定义为以char
结尾的'\0'
序列。
您正在谈论的是字符串文字,而 可以是不可变的。 C标准定义了尝试修改字符串文字是未定义的行为,其类型仍为char *
。所以,如果你肯定在你的C实现中,字符串文字是可写的,你可以这样做! *)
但是你的代码不再是定义良好的C,并且在其他平台上使用只读字符串文字。它将编译,因为通过char *
编写完全正常,但在运行时以不可预测的方式失败(例如,可能是崩溃)。
因此,对于可移植代码来说,仅将字符串文字分配给const char *
指针是最佳做法,如果需要可变字符串,请使用字符串文字作为初始化程序对于char []
。
*)注意这是非常不常见,现在只有专门针对嵌入式或非常旧平台的编译器才能找到它。现代平台将将字符串文字放在只读数据段或类似字段中。
答案 1 :(得分:3)
从s[i]
关键字不属于C规范的日期开始,语法const char []
存在。后来它仍然是反向兼容性。写入此类char *
会导致未定义的行为。 (在您的情况下观察到几次运行的Seg故障)
此行为(从字符串文字或<info>.*?(https.*)\]\]
转换为非常量<info>
)在C ++中得到支持,直到C ++ 11,然后弃用。
C中的类型安全性有限。