C语言void、NULL解析

void:
C语言属于强类型语言。编译器通过变量的数据类型给变量分配具体大小的内存空间,并提供变量的所属类型的解析方法。因此C语言中所有的变量必须都要有明确的数据类型。
void类型的含义是:当前不确定类型,将来会指定具体类型。
void类型的一个典型应用案例就是malloc函数,malloc向系统堆管理器申请一段内存给当前程序使用,申请到内存空间后由于malloc并不能预知这段内存空间将来是分配给什么类型的变量来使用,无论定义成int */double */char *等都不合适,因此就将其定义成void *,表明当前类型不能确定,等到具体使用时再将(void *)强制类型转换为程序需要的具体类型。例如:int *p = (int *)malloc(20);

NULL:
NULL不是C语言中的关键字,而是编译器的一个宏定义:
#ifdef _cplusplus //c++环境下
#define NULL 0
#else
#define NULL (void *)0 //C语言环境下
#endif
NULL的本质是0,但当成一个地址0x00000000来解析。
从指针角度来解析NULL:
int *p; 与 int *p = NULL; 的区别:第一种,p是定义在函数内的一个局部变量,由编译器分配在栈上。由于栈是脏的,因此p的值是脏的,p所指向的地址是随机的,p称为野指针,这种情况下很可能误伤其他正常运行的程序;第二种,将其初始化为NULL,实质是将p的指向绑定为0x0地址处。由于0地址在大部分CPU中是不能随便访问的区域,受操作系统的严密管控,不允许应用程序访问。因此将p指向此处是安全的。一旦解引用p,程序就会触发段错误,编译器会报错提示程序员。
编程良好习惯:一般比较一个指针和NULL是否相等时,会写成if(NULL == p),而不会写成if(p == NULL)。因为一旦不小心把==写成=,第一种情况下编译器会报错;而第二种情况下,程序意思完全变了,但编译器不会报错报警告。

发布了34 篇原创文章 · 获赞 1 · 访问量 1463

猜你喜欢

转载自blog.csdn.net/qq_38958704/article/details/97887680
今日推荐