本文主要是介绍C语言使用指针时有可能导致非法内存操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
##简述
在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当中的成员如果有指针成员,也要注意其初始地址问题哦。
##还有的情况
又发现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
{xxx2_Struct;xxx3_Struct;
}xxx1_Struct, *pxxx1_Struct;
这篇关于C语言使用指针时有可能导致非法内存操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!