将字符串分配给char时会发生什么?

时间:2017-10-04 16:07:35

标签: c arrays char

我写道:

char ch = "ABC";

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

此计划中发生了什么?

1 个答案:

答案 0 :(得分:3)

通常应该发生的事情(至少对于一个相当现代的编译器而言)是你得到一条错误信息,因为所涉及的转换不应该在没有显式转换的情况下发生。

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

#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的指针,我们可以看到存储该字符串文字的地址(注意:如果你编译它,你获得的地址可能会有所不同)。

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

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

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

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