error: cast from ‘int*’ to ‘unsigned int’ loses precision [-fpermissive]

今天在编译一下程序时,发生报错:

#include<stdio.h>

int main()
{
  int i;

  char char_array[5] = {'a', 'b', 'c', 'd', 'e'};
  int int_array[5] = {1, 2, 3, 4, 5}; 

  unsigned int  hacky_nonpointer;

  hacky_nonpointer = (unsigned int) char_array;

  for (int i = 0; i < 5; i++)
  {
    printf("(hacky_nonpointer) points to %p, which contains the char '%c'\n", hacky_nonpointer, *((char *)hacky_nonpointer));
    hacky_nonpointer = hacky_nonpointer + sizeof(char);
  }

  hacky_nonpointer = (unsigned int) int_array;
  
  for (int i = 0; i < 5; i++)
  {
    printf("(hacky_nonpointer) points to %p, which contains the int '%d'\n", hacky_nonpointer, *((int *)hacky_nonpointer));
    hacky_nonpointer = hacky_nonpointer + sizeof(int);
  }

}

报错信息

报错信息

错误原因

在C语言中,指针的大小与内存地址的位数有关。x86体系结构中,内存使用32位地址,所以指针大小也是32位(4字节)。而在x86_64体系结构中,内存使用64位地址,所以指针的大小也是64位。
我下边这两句代码是将指针类型(64位)强制转换为了unsigned int类型(32位):

hacky_nonpointer = (unsigned int) char_array;
hacky_nonpointer = (unsigned int) int_array;

这就导致原本8字节的char_array和int_array被我强制截断成了4字节,进而损失了精度、产生报错。。。

解决方法

将 unsigned int 类型改成 unsigned long类型即可

hacky_nonpointer = (unsigned long) char_array;
hacky_nonpointer = (unsigned long) int_array;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值