[英]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.