问一个linux下的C语言基础的编程问题呀,困扰我好久了。

#include<stdio.h>#include<stdlib.h>#include<string.h>fileapi(FILE*fp){intiret;printf(... #include <stdio.h>

#include <stdlib.h>
#include <string.h>

fileapi( FILE *fp)
{
int iret;
printf( "api fp [%p]\n", fp );
fflush( fp);
iret = fclose(fp);
if( iret != 0)
{
perror("fclose");
}
else
{
printf( "close ok\n");
}
fp = NULL;
printf( "api fp close [%p]\n", fp );
}

main()
{
FILE *fp=NULL;

printf( "fp = [%p]\n", fp );
if( (fp = fopen( "./aaa", "w")) == NULL )
{
printf( " open file error \n");
exit(-1);
}
else
printf( "fp [%p]\n", fp );
fileapi(fp);
printf( " after close fp [%p]\n", fp );
exit(0);
}
为什么我调用函数关闭指针后无效呢?

输出结果如下:
\fp = [(nil)]
fp [0x1bd7010]
api fp [0x1bd7010]
close ok
api fp close [(nil)]
after close fp [0x1bd7010]
展开
 我来答
匿名用户
推荐于2016-06-26
展开全部
已经free/release fp.

你可以试试看 在after close fp [0x1bd7010] 之前 fclose(fp)

会有 double free 的警告
更多追问追答
追问
问题就在这里了,我如果再去关闭的时候会出现问题,严重时甚至会coredump,但是为什么after close fp那里还能打印出来这个指针地址呢?
我想弄明白的就是:我调用了fileapi后,main中怎么判断这个指针是否已经关闭呢?
追答
以址传递的问题

1. 请改原型 fileapi(FILE *fp) 为 fileapi( FILE **fp)

2. API 内的fp 改 *fp
3. main() 内fileapi(fp) 改 fileapi(&fp)

fp = [(nil)]
fp [0x9c02008]
api1 fp [0x9c02008]
close ok
api fp close [(nil)]
after1 close fp [(nil)]
after2 close fp [(nil)]
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
风雷九州
2015-03-06 · TA获得超过3026个赞
知道大有可为答主
回答量:1127
采纳率:100%
帮助的人:459万
展开全部
什么叫关闭指针后无效呢?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式