指针判空
代码中遇到了太多判空的处理,真的绕晕了
整理一下
- 指针
- 数组
- NULL
- ‘\0’
- ‘\r’
- ‘\n’
空指针
空指针不指向任何实际的对象或者函数
char *ptr = NULL;
char *p1 = 0;
printf("p1 %s\n",p1);
printf("ptr %s\n",ptr);
输出的结果:
p1 (null)
ptr (null)
给指针值赋零则使它不再指向任何有意义的东西。为了提高程序的可读性,标准库定义了一个与0等价的符号常量NULL. 程序里可以写 p = 0; 或者 p = NULL;
野指针
“野指针”不是空指针,是指向“垃圾”内存的指针。其地址是不能被有效利用的内存,是不合法的内存。
指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
二、指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。
参考:http://www.cnblogs.com/losesea/archive/2012/11/16/2772590.html
空数组
一个长度为0的数组我们称之为“空数组”,空数组是一个真正的对象,只是包含元素个数为0。
空数组即下标为0的数组,如a[0]。在函数中声明空数组是没有任何意义的,当然也编译不过。而在类或结构体中,是可以这样声明的。
struct ast_exten {
char *exten;
char stuff[0];
};
又如:
struct ast_include {
char *name;
char *rname;
char stuff[0];
};
struct ast_ignorepat {
const char *registrar;
struct ast_ignorepat *next;
char pattern[0];
};
这是个广泛使用的常见技巧,常用来构成缓冲区。比起指针,用空数组有这样的优势:
1.不需要初始化,数组名直接就是所在的偏移
2.不占任何空间,指针需要占用int长度空间,空数组不占任何空间。
NULL
NULL 在c中用(void*)0表示,在c++中用0表示。