在debug一个程序时,发现传入给一个API的参数的值并非预期,于是往上追朔查找,最终发现是在定义指针时没有给该指针赋地址初始值,后面就直接用该指针进行操作了,导致了许多异常。
void func(void)
{
XXX_struct *str_data;
str_data->element1 = globalvar1;
str_data->element2 = globalvar2;
/* ... ... */
func2(str_data);
}
这里在函数func中定义了str_data指针,但是指针的值是地址的,这么没有给它赋初始地址,那这个地址是不确定的:
而接着对str_data的成员进行了赋值的操作,如果这些成员中还有是指针形式的,那就很容易造成访问到没有写访问权限的地址,在ARM MCU当中就极为容易触发hardfault了。没有赋初值的指针,好像是叫幽灵指针吧……
因此,像这里最好这样做:
void func(void)
{
XXX_struct str_data;
str_data.element1 = globalvar1;
str_data.element2 = globalvar2;
/* ... ... */
func2(&str_data);
}
而且str_data当中的成员如果有指针成员,也要注意其初始地址问题哦。
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/suxiang198/article/details/47417457