关于指针类型,关于FreeMem出错.该怎么处理

关于指针类型,关于FreeMem出错.
type
  TAT_INFO = record
  JobTime: DWord;
  DaysOfMonth: DWord;
  DaysOfWeek: UCHAR;
  Flags: UCHAR;
  Command: PWideChar;
  end;
  PAT_INFO = ^TAT_INFO;

var
  ATInfo : PAT_Info;
  dwJobID : PDWORD;

第一个问题:
if ATInfo = nil then Exit;

if @ATInfo = nil then Exit;
有什么区别?


第二个问题:
ATInfo是否需要用GetMem分配内存?
为什么要分配?为什么普通的自定义结构不需要?
分配之后是否应该使用ZeroMemory清零?
dwJobID是PDWORD的指针类型,在调用是否也需要用GetMem分配内存?


第三个问题:
ATInfo^.JobTime := dwRemoteTime;
ATInfo^.DaysOfMonth := 0;
ATInfo^.DaysOfWeek := 0;
ATInfo^.Flags := 1;
ATInfo^.Command := wcCommand;
dwReturn := NetScheduleJobAdd(wcServer, ATInfo, dwJobID);
FreeMem(ATInfo); //这句出现异常


PS:本人很菜,希望大牛别鄙视.










------解决方案--------------------
第一个问题是指针为空,和指针指向的数据为空的区别.就像身份证为空和人为空一样.
第二个问题:你定义的是一个指针,不是数据,那么你的数据放在哪儿呢,就要用GetMem来申请空间,指针再指向这个地方,就像你房号和你家房子一样,没有房子,你拿房号来怎么接快递.
第三个问题是你有没有申请空间,没有申请空间你去把操作系统别的内存修改了当然会错.

------解决方案--------------------
第三个 NetScheduleJobAdd函数肯定是对传入的指针做了修改,导致释放时无法正确获取最初的指针信息