我有以下方法:
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不是一个初始化变量。
如果我将该行更改为(编译器推荐的那样)
22 fpos_t *curPos = NULL;
我收到一个段错误。
为什么会这样?
答案 0 :(得分:5)
您还没有分配curPos
。
所以要么在堆上分配它(并确保稍后释放它!)
fpos_t *curPos = malloc(sizeof(fpos_t));
或在堆栈上
fpos_t curPos;
如果您在堆栈上分配它,则需要将引用传递给fgetpos
:
fgetpos(fp, &curPos)
答案 1 :(得分:1)
您将curPos
声明为指针(fpos_t *
),但从未填写要查找数据的地址。这就是当您尝试将值存储在地址指示的位置时(当您将其更改为fpos_t *curPos = NULL;
时)时出现分段错误的原因
当我查看fgetpos()
的签名时,我意识到您想要的是声明一个fpos_t
并传递您已分配的存储的地址,以便fgetpos()
将写入价值。
fpos_t curPos;
fgetpos(fp, &curPos);
答案 2 :(得分:0)
curPos
需要指向fpos_t
个对象,因此fgetpos
可以存储该位置。