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

Ama*_*man 0 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 }
Run Code Online (Sandbox Code Playgroud)

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

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

 22    fpos_t *curPos = NULL;
Run Code Online (Sandbox Code Playgroud)

我收到一个段错误.

为什么会这样?

Axa*_*alo 5

你没有分配curPos.所以要么在堆上分配它(并确保以后释放它!)

fpos_t *curPos = malloc(sizeof(fpos_t));
Run Code Online (Sandbox Code Playgroud)

或者在堆栈上

fpos_t curPos;
Run Code Online (Sandbox Code Playgroud)

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

fgetpos(fp, &curPos)
Run Code Online (Sandbox Code Playgroud)