想检查是不是空指针,但是生成失败,想知道有没有什么解决方案

#define NULL 0
#define _CRT_SECURE_NO_WARNINGS
#include;
int main()
{
int* p =NULL;
int a = 2;
p = &a;

         if (!p)
         {
             printf("p为空指针");
         }
         else 
        
             printf("p不是空指针");
         }
     
     }

你这肯定没办法检查出来的。。。。
p 它是个变量,那么肯定在栈上有个内存,假如地址为 0x1000
a 它是个变量,那么肯定在栈上有个内存,假如地址为 0x2000
给p 赋值,也就是0x1000 内存里面放了一个值为 NULL
给a赋值,也就是 0x2000 内存里面放了一个值为 2
p = &a
现在你把 a 的地址给了p,也就是0x1000 里面本来放的NULL,现在替换成了0x2000
现在懂了吗?

p=&a,那么p就不是空指针了啊

说下你代码中的问题,
①第二个宏定义,是放在第一行才可以。
②NULL不需要你自己宏定义,它本身就在stdio.h头文件内部。
而且NULL 宏定义为0也不准确。
头文件中是这样写的
#define NULL ( (void*) 0)
③头文件后面有个;

生成失败是什么意思?

iF(p!=null)