gpt4 book ai didi

c - 在 C 中使用指针进行类型转换

转载 作者:太空宇宙 更新时间:2023-11-04 05:34:28 25 4
gpt4 key购买 nike

下面的类型转换是否在内存中创建了一个新变量?它在下面的 printf 函数中被引用,它打印 1.23 作为答案。

#include<stdio.h>
int main(){
int num;
num = 1.23456;
printf("num = %.2f \n", (float)num);
*((float*) &num) = 1.23456;
printf("num = %.2f \n", *((float*)&num));
return 0;
}

最佳答案

num = 1.23456;

num 的值设置为 1。(小数部分 .23456 被丢弃,因为根据 C 语言规则,int 不能保存小数值)

*((float*) &num) = 1.23456;

此处您使用浮点值 1.23456 并使用该位模式覆盖 num 所在的内存位置。我怀疑这是在调用未定义的行为;在任何情况下,这只能在 sizeof(float)==sizeof(int) 的计算机上“工作”,所以这样做不是一个好主意。

printf("num = %.2f \n", *((float*)&num));

这里你假装num所在的内存位置实际上是一个 float 的位置,并打印出该内存,就好像它是一个浮点值一样。它恰好在你的机器上做了你所期望的,但你不应该依赖它这样做。通过像这样进行棘手的转换和类型双关,您实际上是在“躲在编译器的背后”并绕过其类型系统。这可能会咬你(即使在 float 和 int 都占用相同字节数的计算机上)是当你启用优化并且编译器以某种方式优化你的代码时 assumes that an int and a float can't occupy the same address in memory - 但你的代码故意打破了这个假设,因此您的程序最终会做出意想不到的事情(例如崩溃或打印出错误的值)。

Is the following type cast creates a new variable in memory?

C 是一种相当低级的语言(无论如何按照现代标准),它正在尝试执行您的程序告诉它执行的操作,不多也不少。特别是,你的程序告诉它把一个指向 int 的指针当作一个指向 float 的指针,C 编译器相信你知道你在做什么,并让你通过使用强制转换来违反类型系统。因此,该程序并没有在内存中创建新变量,而是以一种可疑且不安全的方式覆盖现有变量 (num) 所在的内存字节。

关于c - 在 C 中使用指针进行类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44361093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com