简述

在debug一个程序时,发现传入给一个API的参数的值并非预期,于是往上追朔查找,最终发现是在定义指针时没有给该指针赋地址初始值,后面就直接用该指针进行操作了,导致了许多异常。

情况说明

void func(void)
{
XXX_struct *str_data;
str_data->element1 = globalvar1;
str_data->element2 = globalvar2;
/* ... ...

这里在函数func中定义了str_data指针,但是指针的值是地址的,这么没有给它赋初始地址,那这个地址是不确定的:

[Pointer]使用指针时有可能导致非法内存操作_异常


而接着对str_data的成员进行了赋值的操作,如果这些成员中还有是指针形式的,那就很容易造成访问到没有写访问权限的地址,在ARM MCU当中就极为容易触发hardfault了。没有赋初值的指针,被称为野指针……

因此,像这里最好这样做:

void func(void)
{
XXX_struct str_data;
str_data.element1 = globalvar1;
str_data.element2 = globalvar2;
/* ... ...

而且str_data当中的成员如果有指针成员,也要注意其初始地址问题哦。

还有的情况

又发现code一个隐藏的问题,一个结构体指针,考虑如下的情况,将pxxx1_Struct初始化为NULL赋给一个变量了,而实际在使用时是使用的其中的xxx2_Struct这个指针成员。在pxxx1_Struct赋值为NULL时,其实xxx2_Struct的内容可能是非NULL的,像这种情况,在使用时必须要注意初始化时xxx2_Struct和xxx3_Struct也要赋值NULL才比较稳妥,要不就在使用的时候既要判断xxx1_Struct是否为NULL,然后再看xxx2_Struct和xxx3_Struct是否为NULL,只要其中有个为NULL,说明就没有给有效地址。

typedef struct