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不指向任何地方之前,它指向了一些随机位置,恰好是有效的可写内存,因此程序碰巧工作。要让它真正正确地工作,您必须实际分配一些内存让它指向。