指针是个涉及到内存,很容易产生bug的根源,总结了几点指针容易出错的问题:
1、对于多级指针,不要在多个函数中分配内存空间,例如:
void func(char** p){
for(int i = 0; i < 5; i++){
p[i] = (char*)malloc(sizoef(char) * 100);
}
}
int main(){
char** p = NULL;
p = (char**)malloc(sizeof(char*) * 10);
}
上面这段代码就是现在main函数中对p指向的空间开辟了一段内存,然后又在func函数中开辟了二级内存,这样在项目开发中是坚决不能出现的,难于维护,难于维护,难于维护,重要的事情说三遍。因为不好释放内存,在main中或者func中释放都不合适。
2、判断内存是否分配成功
若内存没有分配成功,就去操作自以为分配成功的内存,一操作就绝对down掉
3、不能操作NULL空间
跟第二条类型,在操作指针所指向的内存空间时一定要判断是否为NULL,NULL空间时系统保护的内存空间,不准用户操作
4、内存泄漏
这个就不用说了,初学者常犯的错误,总忘记释放内存,另外重点是可能一段代码中分配好几段内存,前面都申请成功了,后面有一个申请失败,那么前面申请的都要释放掉再进行后面的操作或者处理,否则就内存泄漏了。
5、野指针
野指针也是个初学者常犯的错误,释放完内存空间后,一定要让指针指向NULL,否则就变成野指针了,这个就不用说了。
6、(*p)++ 与 *p++
一定要区分(*p)++ 与 *p++两者的区别,一个是指针指向的内存空间里的值加1,一个是指针的地址加1。这也是经常出现bug的一个地方。