char ch = "ABC";
现在,当我编译它,我没有得到任何错误。但是,如果我尝试单独显示这些字符或一次显示整个字符串,我无法这样做,因为每当我尝试这样做时,我的程序就会崩溃。
这个程序发生了什么?
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"
是一个字符串文字,我们可以用它来初始化(以及其它的可能性)指针(常量)焦炭。如果我们将它转换为void指针,我们可以看到该字符串文字被存储的地址(注意:如果你编译这个,你得到的地址可能会不同)。
如果我们将该地址转换为无符号整数,我们得到相同的值。这不是标准保证的,但它几乎是你在大多数典型情况下可能看到的。
最后,我们将指针转换为char
。以十六进制打印出来,我们可以很容易地看到它只保留了地址的8个最低有效位。同样,这个标准确实没有保证8位的事实,但这是char
的典型尺寸。免责声明:尽管您可能期望看到类似于我所展示的结果,但几乎没有一项保证。打印一个指向void的指针是受支持的,但是使用的确切格式取决于编译器/库。同样,转换为整数类型的结果并不完全保证 - 但在大多数典型的计算机/编译器实现中,您可以期望看到类似于上面所示的结果。
底线:分配给char
的值通常是指定用于存储字符串文本(实际上是无用的)的地址的最低有效8位。
@ 4386427:公平点。纠正。 –
你使用什么编译器?你的平台是什么? –
这在任何编译器中都至少应该是一个警告。你使用什么旗帜?你在程序崩溃时会得到什么输出? –
如果你知道代码是错误的,不要担心编译器正在做什么,只需修复代码!并开启警告 –