简述
在debug一个程序时,发现传入给一个API的参数的值并非预期,于是往上追朔查找,最终发现是在定义指针时没有给该指针赋地址初始值,后面就直接用该指针进行操作了,导致了许多异常。
情况说明
这里在函数func中定义了str_data指针,但是指针的值是地址的,这么没有给它赋初始地址,那这个地址是不确定的:
而接着对str_data的成员进行了赋值的操作,如果这些成员中还有是指针形式的,那就很容易造成访问到没有写访问权限的地址,在ARM MCU当中就极为容易触发hardfault了。没有赋初值的指针,被称为野指针……
因此,像这里最好这样做:
而且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,说明就没有给有效地址。