看到了吧,直接解引用编译不过,因为编译器蒙了。

但须注意的是:

不同的编译器对void指针处理是不一样的,如IAR,ANSI C,VC对上述都将出错,而GNU指定“void”的算法操作与“char”一致,因此上述写法在GNU则可以编译

所以做个类型转换,修正如下:

深入了解void指针背后的机理

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;