字符串如何在C中起作用?

时间:2017-11-22 05:37:33

标签: c string c99 ansi-c

字符串在 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>的

我在这里缺少什么?

如果不是如上所述,那么常量字符数组如何变为不可变?

2 个答案:

答案 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中的类型安全性有限。