warning: cast from ‘void*’ to ‘int’ loses precision [-fpermissive] 错误分析

这种错误一般产生在linux 64位机上

因为linux64 上的int为 4个字节

指针为 8个字节

int num = 100;
//此时不会产生错误,但会产生警告,因为4字节的转换为8字节
void* p = (void*) num;


//此时就会产生错误,因为8字节的指针被强转为4字节的int,数据丢失了
num = (int)p;

//解决办法,把int 改为long
long num = 100;

void* p = (void*) num;

num = (long)p;

 

这个错误信息 "cast from 'int*' to 'int' loses precision [-fpermissive]" 是在C++编程中常见的一个编译错误。这个错误表明你试图将一个指向整数的指针(int*)强制转换为整数(int),这会导致精度丢失。让我们详细解释一下: 1. 指针类型 vs 基本数据类型: - int* 是一个指向整数的指针。它存储的是一个内存地址。 - int 是一个基本数据类型,用于存储整数值。 2. 精度丢失: - 指针通常占用 4 字节(在 32 位系统上)或 8 字节(在 64 位系统上)。 - int 通常占用 4 字节。 - 将一个 4 字节或 8 字节的指针转换为 4 字节的 int 会导致数据截断,从而造成精度丢失。 3. 错误原因: 这种转换通常是不正确的,因为指针和整数代表的是不同类型的数据。指针包含的是内存地址,而整数包含的是数值数据。 解决方法: 1. 检查代码逻辑,确保不需要这种转换。 2. 如果确实需要将指针转换为整数(不推荐),可以使用 uintptr_t 或 intptr_t 类型,它们专门用于存储指针地址。 3. 如果你的目的是获取数组中某个元素的地址,确保使用正确的语法。 例如,假设你有一个整数数组: ```cpp int arr[10]; int* p = &arr[0]; ``` 如果你想获取第二个元素的地址,可以直接这样做: ```cpp int* second = &arr[1]; // 正确,不需要转换 ``` 如果你想通过指针算术获取地址,可以这样做: ```cpp int* second = p + 1; // 正确,指针算术 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值