c - 如果我为 int 指针分配一个浮点变量地址,反之亦然,会发生什么?
问题描述
我想知道如果我给一个int
指针一个float
变量地址会发生什么,反之亦然,所以我试了一下,但不能完全理解发生了什么,所以如果有人能解释一下,我将不胜感激。
int n = 5;
float f = 1.21;
float *pf = &n;
int *pn = &f;
printf("%p %p\n", pn, pf);
printf("%p %p\n", &f, &n);
printf("%d %f \n", *pn, *pf);
printf("%f %d \n", n, f);
printf("%d %f \n", n, f);
输出:
0xffffcba8 0xffffcbac 0xffffcba8 0xffffcbac 1067114824 0.000000 0.000000 0 5 1.210000
解决方案
您的代码中有许多未定义行为的实例:
int n = 5;
: 好的float f = 1.21;
: 好的float *pf = &n;
用指向不同类型的指针的值初始化指针。C 标准不保证 this 的作用,也不保证取消引用 this 指针时会发生什么。使用-Wall -W
,您肯定会收到警告,您可以使用强制转换使其静音:float *pf = (float *)&n;
,但结果是相同的,取消引用指针具有未定义的行为。int *pn = &f;
和上面一样。printf("%p %p\n", pn, pf);
-> 您应该将指针转换为,(void *)
因为%p
需要 avoid *
作为参数。int
在一些罕见的系统(旧的 Cray 系统 IIRC)上,指向float
和的指针void
可能有不同的表示,导致此调用以printf
意想不到的方式运行。改用这个:printf("%p %p\n", (void *)pn, (void *)pf);
printf("%p %p\n", &f, &n);
- >同样的问题。改用这个:printf("%p %p\n", (void *)&f, (void *)&n);
两个表达式的输出都是正确且相同的,因为您的系统是常规的,但 C 标准不保证这一点。
printf("%d %f \n", *pn, *pf);
这是正确的,但取消引用指针具有未定义的行为。printf("%f %d \n", n, f);
传递与预期类型不同的类型的值具有未定义的行为。您得到的输出不正确。printf("%d %f \n", n, f);
这个是正确的,输出5 1.210000
符合预期。
推荐阅读
- swift - Swift中的Firebase函数调用返回值
- python - spyder 或 IPython 中奇怪的模块重新加载行为
- css - 使特定的 flexbox 响应式
- python - AttributeError:“gevent._local.local”对象没有属性“值”
- forms - magento 2 联系我们 添加多个收件人
- tsql - 为什么此查询在 STRING_SPLIT 上跳过
- java - 比较类双精度和原始双精度
- node.js - 如何在 node.js 中的 XML 标记之间检索数据
- python - 在 Scrapy 中使用 CrawlSpider 规则
- sql - 最大时间段