首页 > 解决方案 > 用 C 语言理解这段代码的输出

问题描述

#include<stdio.h> 

void main()

{
    int a,b;
    char *cp;

    a=511;

    cp=&a;

    b=*cp;

    *cp=10;

    printf("%d %d %d",a,b,*cp);
}

它在 gcc 中给出266 -1 10并发出警告:从不兼容的指针类型 'int *' [-Wincompatible-pointer-types] cp=&a; 分配给 'char *' 我知道 cp 是一个字符指针,所以它给了我一个警告。

我无法理解 a 和 b 的输出;

标签: coutput

解决方案


您得到的答案将取决于您的特定处理器如何存储整数。在 32 位“小端”机器上,它将存储数字 511(十六进制为 1FF),在内存中某处为:

FF 01 00 00

从最低内存位置 (FF) 到最高 (00)。然后,您获取“a 的地址”并说“将其设为字符指针”并将其分配给“cp”。

除非您错过了“制作这个”部分,而 gcc 会为您执行此操作 - 这就是您收到警告的原因。要删除警告,您必须告诉 gcc:“是的,我想这样做”。您可以通过显式获取整数指针并将其转换为字符指针来做到这一点:

cp = (char *)&a;

好的。所以现在你有一个字符指针指向你存储 FF 的第一个地址。您取消引用此(使用 *cp)以获取签名的 char。this 的值是-1,你把它放在 b 中。

然后将 FF 更改为 0A(十进制为 10)。内存现在看起来像这样:

0A 01 00 00

推荐阅读