[Pointer]在C语言中进行float型与uint8型数组内存拷贝时出现的问题与解决

原创 2015年07月11日 00:18:37
   问题描述:出现的问题比较奇怪,使用的是win7的64位操作系统下的KeiluVision4编译器,以兼容、管理员模式运行的,编写的程序是在ARM的硬件上运行的。由于需要在板上的flash存储芯片里面存储数据,数据是以字节的方式进行存储的,现在有一个float型的数据需要存储,于是声明一个临时数组变量用来存放从flash读取的字节内存,另外float型数据也是先将其4字节内存拷贝到该数组变量中,然后逐个字节存储到flash的。但是一些常见的使用方法进行内存拷贝时都出现了问题。
   联合:首先考虑到union是各个成员共享内存的,于是可以定义一个4个元素的数组变量和一个float型变量:
union arr_to_f {
    float x;
    uint8 a[4];
}u1;
   这样,要把float型数值存储到flash中时,可以给成员u1.x=…;赋值,然后将成员内数组a的四个元素存储到flash,读取时将flash中的值读到数组a中,然后直接使用成员x的值即可。一般这样做是可以的,但是我实际使用时,出了问题,先存储到flash,然后从flash读,再显示float型数值时,始终为0。
   memcpy:使用string.h头文件中的memcpy函数,直接进行内存拷贝,memcpy原型如下:
void *memcpy(void *dest, const void *src, size_t n);
   于是使用
memcpy((uint8*)&x,&a[0],sizeof(a));
   道理是一样的,但是仍然显示的float值一直为0。
  指针操作一:另外使用了x=*(float*)&a[0];这种指针操作方式,结果还是float型数值显示一直为0。
  指针操作二:与指针操作一类型,但是反过来的意思,
for(i=0;i<4;i++){
   *((uint8 *)&x + i) = *(&a[0] + i); // 逐个字节单元进行复制
}
   使用这种方式时,一切就都正常了。
  以上问题解决的思路都是一样的,但是前面几种都没有得到正确的结果,是Keil编译器的问题?但是Keil都支持这些操作的,另外之前在32位系统上使用Keil编程用的就是memcpy的方式又是可以的,难道还是在64位系统下兼容模式使用Keil编译器仍存在某些问题?还是自己的flash驱动有问题?希望在之后的时间能发现其原因。
版权声明:本文为博主原创文章,未经博主允许不得转载。

memcpy函数的使用总结void *memcpy(void *dest, const void *src, size_t n);

memcpy函数的使用总结void *memcpy(void *dest, const void *src, size_t n); 顾名思义由函数的名字以及参数就可以看出该函数的主要功能: c和c++...

memcpy实现数组的定长复制

memcpy 原型:extern void *memcpy(void *dest, void *src, unsigned int count); 用法: #include 功能:由src所指内...
  • educast
  • educast
  • 2013年04月28日 09:07
  • 9112

闲着没事测了一下memcpy

前阵的时候领导提出要对memcpy做一个测试。也没有交代具体的细节。我就直接自已写了个常规memcpy,然后再把内核的__memcpy和glibc的memcpy整出来,对三者进行比较,不比不知道,一比...
  • z2007b
  • z2007b
  • 2011年06月21日 19:09
  • 12070

C语言中int到float的强制类型转换

最近在看一本名为的书。由于我所看过的计算机理论方面的书较少,加上自己大学期间一直也不用功,所以对于计算机的工作原理以及程序的工作方式我始终只知甚少,印象也十分模糊。 不过,应该说我碰到了一本好书。至...

Python与C之间的相互调用(Python C API及Python ctypes库)

write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie讨论新闻组及文件我实现“onekeycodehighlighter"中碰到的一些小问题,需要实现全局快...
  • vagrxie
  • vagrxie
  • 2010年01月24日 17:58
  • 77714

Python处理医学影像学中的DICOM

DICOMDICOM(Digital Imaging and Communications in Medicine)即医学数字成像和通信,是医学图像和相关信息的国际标准(ISO 12052)。它定义...

终于弄懂了keil4,51编程中如何将一个字符串数组复制到另一个字符串数组

C语言基础不行,如果有错请大牛指出,让小弟深入学习 uint8 array_0[]="abcefghijiklm   "; //此处不能写code 51中code代表只读ROM 不能用来赋值...
  • whileil
  • whileil
  • 2014年12月24日 13:51
  • 3035

c语言复制数组的函数

c语言中 数组不能直接用数组名相互赋值 如果需要从a数组中复制k个元素到b数组中 可以使用函数:memcpy(b,a,sizeof(int)*k);以上代码将a,b数组看作是int型 是其他类型做...
  • lox_J2
  • lox_J2
  • 2017年04月06日 17:27
  • 809

大小端模式解析(联合体union)

以前一直知道大小端,很久不做题又把大端和小端记混了,这次来总结一下,以后再也不会混了。 一:什么是大小端 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存...

C语言中,float在内存中的储存方式

浮点型变量在计算机内存中占用4字节(Byte),即32-bit。       遵循IEEE-754格式标准。 一个浮点数由2部分组成:底数m 和 指数e。 ±mantissa × 2exponen...
  • D_Fur
  • D_Fur
  • 2012年03月24日 12:02
  • 3804
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[Pointer]在C语言中进行float型与uint8型数组内存拷贝时出现的问题与解决
举报原因:
原因补充:

(最多只允许输入30个字)