繁体   English   中英

当我将一个字符串分配给一个字符时会发生什么?

[英]What happens when I assign a string to a char?

我写:

char ch = "ABC";

现在,当我编译它时,我没有收到任何错误。 但是,如果我尝试单独显示这些字符或一次显示整个字符串,我就不能这样做,因为每当我尝试这样做时,我的程序就会崩溃。

这个程序中发生了什么?

通常应该发生的事情(至少在相当现代的编译器中)是您收到一条错误消息,因为如果没有显式转换,所涉及的转换不应该发生。

但是,让我们考虑一下当/如果我们确实强迫编译器做肮脏的事情时会发生什么,可以这么说。 让我们考虑一个程序,它包含强制转换的强制转换,执行其他一些事情,使真正发生的事情变得更加清晰(我认为)。

#include <stdio.h>

int main() {
    char const *s = "ABC";

    int i = (int)s;
    unsigned char c = (unsigned char)s; 

    printf("%p\n%8x\n%8x\n", s, i, c);
}

(我使用unsigned char而不是char只是为了防止在碰巧设置了指针的第 7 位时对值进行符号扩展)。

我从中得到的输出如下所示:

0x4005f4
  4005f4
      f4

所以这里发生的事情是"ABC"是一个字符串文字,我们可以使用它来初始化(以及其他可能性)指向(const)char的指针。 如果我们将其转换为指向 void 的指针,我们可以看到存储该字符串文字的地址(注意:如果您编译它,您获得的地址可能会有所不同)。

如果我们将该地址转换为无符号整数,我们会得到相同的值。 标准不能保证这一点,但在大多数典型情况下,这几乎是您可能会看到的。

最后,我们将指针转换为char 以十六进制打印出来,我们可以很容易地看到它只保留了地址的 8 个最低有效位。 同样,标准不能保证它正好是 8 位,但它是char的一个非常典型的大小。

免责声明:虽然您可能会看到与我所展示的结果相似的结果,但几乎没有任何保证。 支持打印出指向 void 的指针,但将使用的确切格式取决于编译器/库。 同样,不能完全保证转换为整数类型的结果——但在大多数典型的计算机/编译器实现中,您可以期望看到与我上面显示的结果类似的结果。

底线:分配给char值通常是分配用于存储字符串文字的地址的最低有效 8 位(这基本上是无用的)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM