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

时间:2015-02-03 20:53:54

标签: 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, 0L, SEEK_END);
 26       pos = ftell(fp);
 27       fsetpos(fp, curPos);
 28    }
 29
 30    return pos;
 31 }

这将编译和工作,但编译器会给我一个警告,因为curPos不是一个初始化变量。

如果我将该行更改为(编译器推荐的那样)

 22    fpos_t *curPos = NULL;

我收到一个段错误。

为什么会这样?

3 个答案:

答案 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可以存储该位置。