C 为什么这种变化会导致seg故障?

C 为什么这种变化会导致seg故障?,c,pointers,C,Pointers,我有以下方法: 17 //returns size in bytes of binary file stream 18 //leaves the file at original position 19 long getFileSize(FILE * fp) 20 { 21 long pos = -1; 22 fpos_t *curPos; 23 if(fgetpos(fp, curPos) == 0) 24 { 25 fseek(fp, 0

我有以下方法:

 17 //returns size in bytes of binary file stream
 18 //leaves the file at original position
 19 long getFileSize(FILE * fp)
 20 {
 21    long pos = -1;
 22    fpos_t *curPos;
 23    if(fgetpos(fp, curPos) == 0)
 24    {
 25       fseek(fp, 0L, SEEK_END);
 26       pos = ftell(fp);
 27       fsetpos(fp, curPos);
 28    }
 29
 30    return pos;
 31 }
这将编译和工作,但编译器会给我一个警告,因为curPos不是一个初始化变量

如果我将该行更改为(编译器建议)

我收到一个seg故障


为什么会这样

您将
curPos
声明为指针(
fpos\u t*
),但从未填写要查找数据的地址。这就是为什么在尝试将值存储在地址指示的位置时(将其更改为
fpos\u t*curPos=NULL;
)会出现分段错误的原因

当我查看
fgetpos()
的签名时,我意识到您想要的是声明一个
fpos\u t
并传递您分配的存储地址,以便
fgetpos()
将写入值

fpos_t curPos;
fgetpos(fp, &curPos);

您将
curPos
声明为指针(
fpos\u t*
),但从未填写要查找数据的地址。这就是为什么在尝试将值存储在地址指示的位置时(将其更改为
fpos\u t*curPos=NULL;
)会出现分段错误的原因

当我查看
fgetpos()
的签名时,我意识到您想要的是声明一个
fpos\u t
并传递您分配的存储地址,以便
fgetpos()
将写入值

fpos_t curPos;
fgetpos(fp, &curPos);

curPos
需要指向一个
fpos\u t
对象,因此
fgetpos
有一个存储位置。

curPos
需要指向一个
fpos\u t
对象,因此
fgetpos
有一个存储位置。

您尚未分配
curPos。
因此,要么在堆上分配它(并确保稍后释放它!)

或者在堆栈上

fpos_t curPos;
如果在堆栈上分配,则需要将引用传递到
fgetpos

fgetpos(fp, &curPos)

您尚未分配
curPos
。 因此,要么在堆上分配它(并确保稍后释放它!)

或者在堆栈上

fpos_t curPos;
如果在堆栈上分配,则需要将引用传递到
fgetpos

fgetpos(fp, &curPos)

在您明确告诉curPos不指向任何地方之前,它指向了一些随机位置,而这些位置恰好是有效的可写内存,因此程序的运行是巧合。为了让它真正正确地工作,你必须实际分配一些内存让它指向。在你明确告诉curPos不指向任何地方之前,它指向了一些随机位置,恰好是有效的可写内存,因此程序碰巧工作。要让它真正正确地工作,您必须实际分配一些内存让它指向。