c - 用 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 的输出;
解决方案
您得到的答案将取决于您的特定处理器如何存储整数。在 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
推荐阅读
- php - 手动输入完整网址时网站不安全?
- python - 如何对 dataframe.rolling.sum() 生成的每个索引中的每个值表求和
- javascript - 在显示 javascript 的输出时遇到一些问题
- python - Tkinter gui 不起作用鼠标和键盘模块
- c++ - 测量操作块的时间
- python - 从前端插入记录时如何将当前用户自动插入我的数据库
- go - 在 Mainflux 中接收来自 Nats 的消息
- vaadin - 如何在 Vaadin Fusion 中将 URL 参数与路由器一起使用?
- jestjs - 在@apollo/client 中测试 OnSubscriptionData 功能
- python - python reuters tex 分类 MDC 和 Naive 坏预测