警惕数组指针的类型转换

前言

指针一直是 C语言 中一个比较复杂的部分,指针赋予了 C语言 高度的灵活性的同时,也带来了对程序员素质的高要求性

这篇文章的目的在于介绍在对指针数组做类型转换时需要注意的问题

正文

类型转换是很常见的一种操作,编译器会在隐式类型转换时提出警告,但是在你强制类型转换后就不会警告了,不过不警告不代表没有问题,可能在编译时没有问题的程序在运行时才出现问题,甚至在运行多次才出现问题

例如如下的一段简单的代码

#include <stdio.h>

int main()
{
    __int8  table[4]   = {0x01,0x02,0x03,0x04,};
    __int8  *bit8_p     = table;
    __int16 *bit16_p    = (__int16 *)table;
    __int32 *bit32_p    = (__int32 *)table;

    printf("bit8_p[0]=0x%02x\n", bit8_p[0]);
    printf("bit16_p[0]=0x%04x\n", bit16_p[0]);
    printf("bit32_p[0]=0x%08x\n", bit32_p[0]);
}

代码中定义了一个 int8 类型的 4个 成员的数组,然后通过 3种不同类型的指针去访问,得到的结果却是不一样的

bit8_p[0]=0x01
bit16_p[0]=0x0201    
bit32_p[0]=0x04030201

因此这里面就潜在着数组访问越界的问题,通过一段简单的程序进行表示

for (int i = 0; i < 4; i++)
{
    printf("table[%d]=%d ", i, table[i]);
    printf("bit8_p[%d]=%d ", i, bit8_p[i]);
    printf("bit16_p[%d]=%d ", i, bit16_p[i]);
    printf("bit32_p[%d]=%d\n", i, bit32_p[i]);
}

程序输出结果如下

table[0]=1 bit8_p[0]=1 bit16_p[0]=513 bit32_p[0]=67305985
table[1]=2 bit8_p[1]=2 bit16_p[1]=1027 bit32_p[1]=6684156
table[2]=3 bit8_p[2]=3 bit16_p[2]=-516 bit32_p[2]=0
table[3]=4 bit8_p[3]=4 bit16_p[3]=101 bit32_p[3]=6684156

虽然运行没有报错,不过从输出可以看出,得出的结果已经不是我们想要的数据了,由于数组访问越界,已经是一些随机值了

结论

指针的类型不能随便转换,转换后要警惕内存访问越界

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值