看到了吧,直接解引用编译不过,因为编译器蒙了。
但须注意的是:
不同的编译器对void指针处理是不一样的,如IAR,ANSI C,VC对上述都将出错,而GNU指定“void”的算法操作与“char”一致,因此上述写法在GNU则可以编译
所以做个类型转换,修正如下:
void型指针解引用须做类型指定。
类型转换的时候须注意类型匹配。
另外,如果函数类型可以是任意类型的指针,则需将其参数定义为void *指针,例如string.h中关于内存操作的函数集:
__EFF_NENW1NW2 __ATTRIBUTES int memcmp(const void *, const void *,
size_t);
__EFF_NENR1NW2R1 __DEPREC_ATTRS void * memcpy(void *_Restrict,
const void *_Restrict,
size_t);
__EFF_NENR1NW2R1 __DEPREC_ATTRS void * memmove(void *, const void *,
size_t);
__EFF_NENR1R1 __DEPREC_ATTRS void * memset(void *, int, size_t);
非易失存储管理应用
在单片机开发中,往往需要实现数据的非易失存储。所谓非易失存储,就是数据改写后在掉电后仍然能保持。哪些是非易失存储介质呢?比如EEPROM,FLASH等都属于非易失存储介质。
比如一个产品里面有很多各种各样的参数,且分布在各个子系统文件中。举个栗子:
/*模块A中有这样一个结构体需要非易失存储*/
typedef struct _t_paras{
int language;/*语言种类*/
char SN[20]; /*产品序列号*/
}T_PARAS;
T_PARAS sysParas;
/*模块B中有这样一个结构体需要非易失存储*/
typedef struct _t_pid{
float kp;
float ki;
float kd;
float T;
}T_PID;