先说结论:指针在使用时一定要进行初始化。
一、问题来源
问题提示:null pointer dereference.
此问题在编译时无误,在运行时出的问题,排查起来非常头疼。
一开始没头绪,经同事一起排查,定位为指针定义时未初始化导致。
解引用:解析指针变量所指向地址中的内容,空指针解引用会报错。
二、指针使用浅总结
1、在定义时初始化指向另一变量
int m=1;
int *n=&m; // 指针n指向int类型空间的变量m
2、在初始化时使用malloc或new为其分配堆空间
一般较少使用,使用new分配空间后,后面一定要对其进行释放,否则容易造成内存泄漏。
typedef struct test{
int m;
int n;
}T;
void main()
{
int k = 0;
T *t = new T(); // C++
// T *t = (T *)malloc(sizeof(T)); // C 语言
k = t->m;
}
3、对于单个变量直接进行&操作
对于某些不需要指针的场景,可以进行变量声明后直接进行&操作。
4、定义时直接赋值为NULL
声明为NULL一定要为其分配明确的空间。
若指针后续未分配指向空间就直接使用,那么可以在编译期间就发现问题。
5、通用接口void*的适配问题
对于某些中间件的commn接口,形参往往定义为void *的形式。当我们进行实参传入时,需保证实参指向明确的地址。
void halSetEnable(BOOL param1)
{
return param1;
}
void HalCommn(void* param1)
{
halSetEnable(*(BOOL*)param1); // 解引用操作,需保证入参有明确指向地址,不然对空指针解引用有问题
}
int SetEnable(BOOL bEnable)
{
BOOL temp_enable = bEnable; // 作用域为本函数
HalCommn((void*)&temp_enable); // 需保证实参在有明确的地址空间,不然后续解引用会有问题
}
三、小结
之前在开始开发纯C的裸机软件时指针的定义较为随意,经常会出现未初始化的过程,这块理解的缺失直到今天才爆发出来,需谨记!