1、指针不要赋值为硬编码;
所谓的硬编码就是写死的。
像我们初始化一些设备的参数时,通常会有一些配置文件,然后在设备启动的时候,会加载到固定的内存地址中,然后程序到特定的内存中读取数据并加载。这个时候用硬编码比较合适,但是如果在开发程序的时候,使用硬编码的方式来为指针赋值就会很危险。
例如如下代码:
//1、硬编码 int *p = (int *)0x12345678; printf("&p=%#x \n",&p);//&p=0xf813faf8 printf("p=%d \n",p);//&p=305419896 printf("*p=%d \n",*p);//error 会有问题
2、空指针NULL的用法;
NULL的源代码:
可以看到是NULL的值是0,这是一个特殊的地址
#ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif
在C语言或者C++中,NULL指针也是经常使用的。
例如:
如果我们定义了一个NULL的指针,在赋值初始化的时候,就会报错。
//2、空指针NULL int *pn = NULL; printf("%#x \n",&pn);//0xaf7df7c8 *pn = 10;//error 会报错 Process finished with exit code -1073741819 (0xC0000005) printf("%d \n",pn);
一般先判断一下是否生效,然后再使用
//2、空指针NULL int *pn = NULL; printf("%#x \n",&pn);//0xaf7df7c8 if(pn) { *pn = 10;//error 会报错 Process finished with exit code -1073741819 (0xC0000005) printf("%d \n",pn); }
3、注意避免产生野指针;
例如:
例如我们定义了一个全局的指针,想在多个地方使用,那么使用时应该注意,如果在一个函数中使用完毕时,应该赋值为NULL指针,这样的话我们才可以有效的判断,否则无法确定这个指针是否有效,这就是野指针
int *pp1; void Test() { int a = 100; pp1 = &a; }
改版:
int *pp1; void Test() { int a = 100; pp1 = &a; //....省略中间过程 //结束时 赋值为NULL pp1 = NULL; }
总结
- 1、指针不要赋值为硬编码;
- 2、空指针NULL的用法;
- 3、注意避免产生野指针;