代码之家  ›  专栏  ›  技术社区  ›  Tarun Maganti

字符串在C中是如何工作的?

  •  3
  • Tarun Maganti  · 技术社区  · 8 年前

    字符串在 C 编程语言。

    所以,当我发表这样的声明时 char *s = "Hello" ,我知道了 s 指向的内存位置 H 因为“Hello”存储在程序的一些静态内存中 "Hello" 是不变的。

    它是指变量吗 s 现在是类型的变量 指向常量数据的指针 例如 const int a = 3;const int *i = &a; . 这似乎是因为我无法操作数据(当我这样做时,它会导致分割错误)。

    但,若真是这样,编译器不应该能够检测并说我已经将合格数据分配给了不合格变量吗。 类似于 char *p p是指向非限定字符的指针 当我说 char *p="Hello" p、 指向非限定字符的指针不能指向常量字符类型 ?

    我错过了什么?

    如果不是上述情况,那么如何使常量字符数组不可变?

    2 回复  |  直到 8 年前
        1
  •  4
  •   user2371524 user2371524    8 年前

    首先,a 一串 在C中并不是一成不变的。C甚至不知道a 对于字符串-a 一串 定义为一系列 char 以结尾 '\0' .

    你说的是 字符串 他们 可以 一成不变。C标准定义,试图修改字符串文字是 未定义的行为 ,他们的类型仍然是 char * . 所以,如果你是 在C的实现中,字符串文字是可写的,您可以这样做!*)

    但是,您的代码将不再是定义良好的C语言,也无法在其他具有只读字符串文字的平台上工作。它会的 编写 ,因为通过 字符* 很好,但在运行时以不可预测的方式失败(例如,可能发生崩溃)。

    因此,对于可移植代码来说,最好只将字符串文字分配给 const char * 指针,如果需要可变字符串,请使用字符串文字作为 初始值设定项 对于 char [] .


    *)小心这是 不常见的情况是,现在只有针对嵌入式或非常旧的平台的专门编译器才能使用它。现代化的平台 将字符串文字置于只读数据段或类似数据段中。

        2
  •  3
  •   Mohit Jain    8 年前

    语法 char *s = "Hello"; 自以下日期起出现 const 关键字不是C规范的一部分。后来它保留了反向兼容性。写信给这样的人 s[i] 会导致未定义的行为。(在您的案例中观察到几次Seg故障)

    此行为(从字符串文字或 const char [] 变为非常数 char * )在C++11之前一直在C++中受支持,但后来被弃用。

    C中的类型安全性有限。