关于指针问题,报错:flag是nullprt

图片说明
程序如下,请指出错误代码,谢谢。。
// a.h

 #ifndef            _A_H
#define     _A_H
#define     int32_t   int
#define     uint32_t     unsigned int
#define     TMax      1;
#define     TMin      -1;
#define     NULL        0;

int32_t  sat_add(int32_t, int32_t, int32_t*);
uint32_t  sat_sub(uint32_t, uint32_t, uint32_t*);

#endif

//middle.c

 #include "a.h"
uint32_t   sat_add(uint32_t x, uint32_t y, uint32_t* flag)
{
    uint32_t  r = x + y;
    if ( x > 0 && y > 0 && r < 0)               //正溢出
    {
            *flag = TMax;        
    }
    else if ( x < 0 && y < 0 && r > 0)      //负溢出
    {
            *flag = TMin;
    }
    else            //不溢出
    {
            *flag = NULL;
    }
    return  r;
}

uint32_t  sat_sub(uint32_t  x, uint32_t  y, uint32_t*  flag)
{
    uint32_t  r = x - y;
    if (x - r != x - (x - y)) {
        *flag = TMin;
    }
    else {
        *flag = NULL;
    }
    return r;
}

//main.c

 #include<stdio.h>
#include "a.h"
void main() {
    int32_t  c = 0;
    int32_t  x1, y1,t1;
    int32_t  *p1 = NULL;
    uint32_t x2, y2,t2;
    uint32_t *p2 = NULL;
    printf_s("1  判断加法溢出\n");
    printf_s("2  判断减法溢出\n");
    printf_s("3  退出\n");
    printf_s("输入你的命令:");
    scanf_s("%d", &c);
    while (1) {
        switch (c) {
        case 1:
            printf_s("输入两个有符号数:");
            scanf_s("%d %d", &x1, &y1);
            t1=sat_add(x1,y1,p1);
            printf_s("%d %d", t1,*p1);
            break;
        case 2:
            printf_s("输入两个无符号数:");
            scanf_s("%d %d", &x2, &y2);
            t2=sat_sub(x2,y2,p2);
            printf_s("%d %d", t2,*p2);
            break;
        case 3:
            break;
        default:
            printf_s("没有该指令,重新输入:");
            break;
        }
        if (c == 3) break;
    }
}

p1、p2初始化为NULL,在加减函数里如果溢出被赋值,这么使用是错误的。
p1、p2没有指向具体空间,数存哪里?
可以这样:

int32_t tp1;
p1=&tp1;
uint32_t tp2;
p2=&tp2;