今天在编译一下程序时,发生报错:
#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;