2017-10-04 64 views
-4

我写道:当我将字符串分配给字符时会发生什么?

char ch = "ABC"; 

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

这个程序发生了什么?

+1

你使用什么编译器?你的平台是什么? –

+0

这在任何编译器中都至少应该是一个警告。你使用什么旗帜?你在程序崩溃时会得到什么输出? –

+2

如果你知道代码是错误的,不要担心编译器正在做什么,只需修复代码!并开启警告 –

回答

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"是一个字符串文字,我们可以用它来初始化(以及其它的可能性)指针(常量)焦炭。如果我们将它转​​换为void指针,我们可以看到该字符串文字被存储的地址(注意:如果你编译这个,你得到的地址可能会不同)。

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

最后,我们将指针转换为char。以十六进制打印出来,我们可以很容易地看到它只保留了地址的8个最低有效位。同样,这个标准确实没有保证8位的事实,但这是char的典型尺寸。免责声明:尽管您可能期望看到类似于我所展示的结果,但几乎没有一项保证。打印一个指向void的指针是受支持的,但是使用的确切格式取决于编译器/库。同样,转换为整数类型的结果并不完全保证 - 但在大多数典型的计算机/编译器实现中,您可以期望看到类似于上面所示的结果。

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

+0

@ 4386427:公平点。纠正。 –

相关问题