我写道:
char ch = "ABC";
现在,当我编译它时,我没有收到任何错误。但是,如果我尝试单独显示这些字符或者同时显示整个字符串,我就无法这样做,因为每当我尝试这样做时,我的程序就会崩溃。
此计划中发生了什么?
答案 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位(基本上没用)。