指针强制类型转换触发内存自动对齐
C语言的指针是我们操作很灵活,但是也留下了不少坑,今天工作遇到了一个指针的坑,这里复现一下:
指针类型强制转换,并进行解引用,引起的内存对齐问题.
(一)问题复现:
运行环境:Ubuntu 16.04
#include <stdio.h>int main(void)
{char cTestBuffer[10] = {0,1,2,3,4,5,6,7,8,9};char *pcData = &cTestBuffer[5];int iDest =0;int i=0;for(i=0;i<10;i++){printf("cTestBuffer[%d]=0x%08x\n",i,&cTestBuffer[i]);}printf("pcData指针地址=0x%08x\n",pcData);iDest = *(int *)pcData;printf("iDest实际值=0x%08x\niDest期望值=0x%02x%02x%02x%02x\n",iDest,pcData[3],pcData[2],pcData[1],pcData[0]);}
^
root@virtual-machine:~/test# ./a.out
cTestBuffer[0]=0x3139ca70
cTestBuffer[1]=0x3139ca71
cTestBuffer[2]=0x3139ca72
cTestBuffer[3]=0x3139ca73
cTestBuffer[4]=0x3139ca74
cTestBuffer[5]=0x3139ca75
cTestBuffer[6]=0x3139ca76
cTestBuffer[7]=0x3139ca77
cTestBuffer[8]=0x3139ca78
cTestBuffer[9]=0x3139ca79
pcData指针地址=0x3139ca75
iDest实际值=0x08070605
iDest期望值=0x08070605
root@lvirtual-machine:~/test#
(二)问题解析:
我这里使用的编译器并没有任何问题,在我自己的电脑无论如何都复现不了该问题,该问题可能有的编译器进行了优化,所以我们看不到现象,但是当我们进行指针强制类型转换时要注意字节对齐,当我们对char指针类型转换为ULONG类型时,在赋值操作采用memcpy进行操作,否则可能出现意想不到的错误
这篇文章中楼主复现了该问题:C语言,指针强制类型转换与内存对齐
指针强制类型转换触发内存自动对齐相关推荐
- C语言指针强制类型转换
概要: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个地址就是硬件访问的依据,而名字只是提供给 ...
- c语言指针强制类型转换的应用
指针类型简介 c语言中,指针是就是内存地址,因此使用指针可以方便的操作内存数据.指针的类型标志着这个指针指向数据的类型,有两个作用: 告诉了编译器需要从这个地址开始对**多少字节(n)**的数据进行操 ...
- linux 强制类型转换,转载 指针强制类型转换
当我们初始化一个指针或给一个指针赋值时,赋值号的左边是一个指针,赋值号的右边是一个指针表达式.在我们前面所举的例子中,绝大多数情况下,指针的类型和指针表达式的类型是一样的,指针所指向的类型和指针表达式 ...
- 函数指针的强制类型转换与void指针
前两天在移植一个DVB芯片的驱动库时,遇到一个情况: 驱动库的作者为了使DVB芯片兼容尽可能多的tuner芯片,在定义tuner_init函数指针时,参数中的handle定义为(void* handl ...
- c语言数组变量的类型转换,C语言强制类型转换
概要: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个地址就是硬件访问的依据,而名字只是提供给 ...
- C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)
强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...
- C语言指针与强制类型转换
指针与强制类型转换 变量数据类型的含义 指针数据类型的含义 有符号数和无符号数的区别 变量数据类型的含义 所有类型的数据存储在内存中都是按照二进制格式存储的,所以内存中只有0和1,并不知道是int的还 ...
- c语言不通类型指针转换,C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)...
强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...
- C语言里 指针变量强制类型转换,C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)...
强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...
最新文章
- 类脑信息处理研究取得进展
- nginx 如何显示真实ip
- go 语言 mysql_Go语言基础之操作MySQL
- 终端传感了解吗?18个知识点为你扫盲
- Lesson Plan 教学计划 翻译
- Web压力测试工具 - Siege
- 使用ViewPager + Fragment实现微信底部Tab效果
- 如何用python制作五子棋游戏_Python制作打地鼠小游戏
- 始终都要覆盖toString()方法
- 使用JMX监控Zookeeper状态Java API
- 中西方关于颜色的理解对比
- 苹果开发那些事儿-D-U-N-S 号申请
- java高德地图api开发平台_【高德地图API】从零开始学高德JS API(一)地图展现...
- tcp/ip详解卷一总结
- linux怎么看sda3内容,linux系统中/dev/sda3表示什么。急
- ubuntu 编译 找不到 -ly
- 移动10大跨平台工具
- SQL、MySQL与HiveSQL的使用区别ing
- GO/KEGG富集分析泡泡图中为什么基因的数目是小数?
- sim7000c驱动_SIM7000C硬件设计手册_V1.00-SIMCom.PDF
热门文章
- linux6.6 sudo环境变量,linux sudo环境变量设置
- SpingBoot 整合 kafka Elk
- H5 微信公众号 授权登录 前后端分离篇(后端02)
- Super详解(重点)
- python3-pandas DataFrame 索引、bool索引、pandas 字符串方法
- JavaScript-分支和循环
- 深入体验php项目开发.pdf,《深入体验PHP项目开发》.(谭贞军).[PDF]
- java 发送16进制数据'_java 16进制数据递增
- BugkuCTF-MISC题神秘的文件
- c语言100000阶乘,求10000的阶乘(c语言代码实现)