为什么此更改会导致段错误?
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)
我有以下方法:
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)