为什么此更改会导致段错误?

Why is this change causing seg fault?

我有以下方法:

 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;

我收到一个段错误。

为什么会这样?

您将curPos声明为指针(fpos_t *),但从未填写要查找数据的地址。这就是为什么当您尝试将值存储在地址指示的位置时(当您将其更改为 fpos_t *curPos = NULL;

时出现分段错误的原因

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

fpos_t curPos;
fgetpos(fp, &curPos);

curPos需要指向一个fpos_t对象,所以fgetpos有地方存放位置。

您还没有分配curPos。 所以要么在堆上分配它(一定要稍后释放它!)

fpos_t *curPos = malloc(sizeof(fpos_t));

或在堆栈上

fpos_t curPos;

如果您在堆栈上分配它,您需要将引用传递给 fgetpos:

fgetpos(fp, &curPos)