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语言,指针强制类型转换与内存对齐

指针强制类型转换触发内存自动对齐相关推荐

  1. C语言指针强制类型转换

    概要: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个地址就是硬件访问的依据,而名字只是提供给 ...

  2. c语言指针强制类型转换的应用

    指针类型简介 c语言中,指针是就是内存地址,因此使用指针可以方便的操作内存数据.指针的类型标志着这个指针指向数据的类型,有两个作用: 告诉了编译器需要从这个地址开始对**多少字节(n)**的数据进行操 ...

  3. linux 强制类型转换,转载 指针强制类型转换

    当我们初始化一个指针或给一个指针赋值时,赋值号的左边是一个指针,赋值号的右边是一个指针表达式.在我们前面所举的例子中,绝大多数情况下,指针的类型和指针表达式的类型是一样的,指针所指向的类型和指针表达式 ...

  4. 函数指针的强制类型转换与void指针

    前两天在移植一个DVB芯片的驱动库时,遇到一个情况: 驱动库的作者为了使DVB芯片兼容尽可能多的tuner芯片,在定义tuner_init函数指针时,参数中的handle定义为(void* handl ...

  5. c语言数组变量的类型转换,C语言强制类型转换

    概要: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个地址就是硬件访问的依据,而名字只是提供给 ...

  6. C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)

    强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...

  7. C语言指针与强制类型转换

    指针与强制类型转换 变量数据类型的含义 指针数据类型的含义 有符号数和无符号数的区别 变量数据类型的含义 所有类型的数据存储在内存中都是按照二进制格式存储的,所以内存中只有0和1,并不知道是int的还 ...

  8. c语言不通类型指针转换,C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)...

    强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...

  9. C语言里 指针变量强制类型转换,C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)...

    强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...

最新文章

  1. 类脑信息处理研究取得进展
  2. nginx 如何显示真实ip
  3. go 语言 mysql_Go语言基础之操作MySQL
  4. 终端传感了解吗?18个知识点为你扫盲
  5. Lesson Plan 教学计划 翻译
  6. Web压力测试工具 - Siege
  7. 使用ViewPager + Fragment实现微信底部Tab效果
  8. 如何用python制作五子棋游戏_Python制作打地鼠小游戏
  9. 始终都要覆盖toString()方法
  10. 使用JMX监控Zookeeper状态Java API
  11. 中西方关于颜色的理解对比
  12. 苹果开发那些事儿-D-U-N-S 号申请
  13. java高德地图api开发平台_【高德地图API】从零开始学高德JS API(一)地图展现...
  14. tcp/ip详解卷一总结
  15. linux怎么看sda3内容,linux系统中/dev/sda3表示什么。急
  16. ubuntu 编译 找不到 -ly
  17. 移动10大跨平台工具
  18. SQL、MySQL与HiveSQL的使用区别ing
  19. GO/KEGG富集分析泡泡图中为什么基因的数目是小数?
  20. sim7000c驱动_SIM7000C硬件设计手册_V1.00-SIMCom.PDF

热门文章

  1. linux6.6 sudo环境变量,linux sudo环境变量设置
  2. SpingBoot 整合 kafka Elk
  3. H5 微信公众号 授权登录 前后端分离篇(后端02)
  4. Super详解(重点)
  5. python3-pandas DataFrame 索引、bool索引、pandas 字符串方法
  6. JavaScript-分支和循环
  7. 深入体验php项目开发.pdf,《深入体验PHP项目开发》.(谭贞军).[PDF]
  8. java 发送16进制数据'_java 16进制数据递增
  9. BugkuCTF-MISC题神秘的文件
  10. c语言100000阶乘,求10000的阶乘(c语言代码实现)